ZFクイックスタートは、ZF1.xで適切に機能するように見えるデータマッパーパターンの例を提供します。Zend_Dbを使用するためにデータマッパーを実装する必要はありません。DbTableモデルとZend_Db_Table_Abstractによって提供されるメソッドを使用するだけで、非常に優れた機能を取得できます。
少し説明すると:
Application_Model_Guestbook:単純なドメインモデル(操作するオブジェクト)になります。
Application_Model_GuestbookMapper:データベース列をドメインモデルのプロパティにマップするためのデータマッパーになります。
Application_Model_DbTable_Guestbook:データベースとデータベースアダプタ間の接続を提供するゲートウェイモデルです。ここで、データベーステーブルのオプションと他のテーブルとの関係を指定できます。
データマッパーがアプリケーションにどのように適用されるかを理解する前に、ZFとモデルの経験が少し必要でした。複数のデータベーステーブルに依存するオブジェクトを作成し始めたとき、これらの要素がどのように組み合わされるかを本当に理解し始めました。
'
多くの経験豊富なZF開発者がDoctrineまたは他のORMをすぐに推奨していることに気付くでしょう。おそらくそれが正しい選択です(そして一部の人にとっては反射的であるようです)。少なくともそのORMが行っていることの基本を理解するまで、ORMを使い始めるべきではないと感じています。
[編集]
基本マッパークラスのfetchAll()と同等のメソッドで、Zend_Db_Table_Abstractのインスタンスを__constructorに渡します。
public function findAll($order = NULL) {
$select = $this->_getGateway()->select();
if (!is_null($order)) {
$select->order($order);
}
$rowset = $this->_getGateway()->fetchAll($select);
$entities = array();
foreach ($rowset as $row) {
//abstract method required in each table mapper, this instantiates the domain model
$entity = $this->createEntity($row);
//identiy map allows lazy loading of certain members
$this->_setMap($row->id, $entity);
$entities[] = $entity;
}
//returns an array of domain models instead
return $entities;
}
テーブル固有のマッパーのcreateEntity()メソッド
public function createEntity($row) {
$data = array(
'id' => $row->id,
'name' => $row->name,
'art' => $row->art,
'year' => $row->year,
);
$entity = new Music_Model_Album($data);
//set artist id to reference map for lazy loading
$entity->setReferenceId('artist', $row->artist_id);
return $entity;
}
幸運を