Zend_Db_Table_Rowのカスタマイズ

こんにちは、バズー株式会社、開発チームリーダーの清水です。

バズーでは、アプリケーションプラットフォームとして、PHPZend 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->カラム名」で他のカラムの値が取得できます。テーブルを正規化していくと、一覧ページのテンプレートが致命的に汚くなるか、コントローラが太るので、モデルにこうやって書くと非常に綺麗にかけます。