ゴードンが正しい答えを持っている可能性が非常に高いのと同じくらい、私はそれが私の好みと現在のニーズにとって非常に複雑であると感じています。
私はすべてのドメインマッパーにベースマッパークラスを使用しており、可能な限り多くの機能をベースクラスに組み込んでいます。
私はすべてのマッパーでかなりうまく機能する列検索メソッドを使用しています。
//from abstract class Model_Mapper_Abstract
//The constructor of my base class accepts either a dbtable model
// or the name of a table stored in the concrete mapper tablename property.
public function __construct(Zend_Db_Table_Abstract $tableGateway = null)
{
if (is_null($tableGateway)) {
$this->tableGateway = new Zend_Db_Table($this->tableName);
} else {
$this->tableGateway = $tableGateway;
}
}
/**
* findByColumn() returns an array of entity objects
* filtered by column name and column value.
* Optional orderBy value.
*
* @param string $column
* @param string $value
* @param string $order optional
* @return array of entity objects
*/
public function findByColumn($column, $value, $order = null)
{
//create select object
$select = $this->getGateway()->select();
$select->where("$column = ?", $value);
//handle order option
if (!is_null($order)) {
$select->order($order);
}
//get result set from DB
$result = $this->getGateway()->fetchAll($select);
//turn DB result into domain objects (entity objects)
$entities = array();
foreach ($result as $row) {
//create entity, handled by concrete mapper classes
$entity = $this->createEntity($row);
//assign this entity to identity map for reuse if needed
$this->setMap($row->id, $entity);
$entities[] = $entity;
}
//return an array of entity objects
return $entities;
}
少なくともこれがアイデアジェネレータとして役立つことを願っています。SQL Count()
また、これと同様のメソッドでステートメントを実装する場合は、select()をビルドするときにZend_Db_Expr()を使用すると簡単になります。