Zend_Db_Table_Rowのカスタマイズ
こんにちは、バズー株式会社、開発チームリーダーの清水です。
バズーでは、アプリケーションプラットフォームとして、PHP の Zend Framework を全面的に採用しています。
Zend_Db_Table を使っていて、データベースのテーブルに存在しないカラムを仮想的に作るための方法です。
(1)Zend_Db_Table を使って検索したモデルは Zend_Db_Table_Row を継承しています。このクラスを継承した子クラスを作り、親テーブルがそれを参照するようにします。
class Dao_Test extends Zend_Db_Table_Abstract {
protected $_name = 'dtb_test';
protected $_primary = 'id';
protected $_rowClass = 'Dao_Row_Test';
}
「dtb_test」はテーブル名、「id」は主キー名、「_rowClass」は今回使用する Zend_Db_Table_Row を継承したクラスです。
(2)つづいて Zend_Db_Table_Row を継承したクラスを作ります。
class Dao_Row_Test extends Zend_Db_Table_Row {
/**
* @override
*/
public function __get($columnName) {
if ($columnName == 'some_where_col1') {
return 'something';
} elseif ($columnName == 'some_where_col2') {
return '[' . $this->id * 100 ']';
} else {
return parent::__get($columnName);
}
}
}
仮想カラム「some_where_col1」と「some_where_col2」を作ってみました。「$this->カラム名」で他のカラムの値が取得できます。テーブルを正規化していくと、一覧ページのテンプレートが致命的に汚くなるか、コントローラが太るので、モデルにこうやって書くと非常に綺麗にかけます。