我在我的Zend Framework Web应用程序中实现Data Mapper设计模式,一切顺利,我真的很高兴使用Zend中的数据映射器而不仅仅应用Row Gateway模式,但是我遇到了一个问题我的建筑。我不确定如何使用我的数据映射器以OOP方式引用和处理外键约束。
所以我有我的Model类,我的DbTable类和我的Mapper类。我应该将所有外键关系放在我的DbTable类中,这样我就可以使用findDependentRowset()
函数在我的映射器中检索,或者更好的方法是在我的映射器中实例化依赖类。使用Data Mapper模式映射外键的最佳OOP实践是什么?
答案 0 :(得分:4)
我会选择DataMapper,因为其他两个人本身并不知道ID,因为关系调用者总是需要它。
Model
- Property accessors and private property data holders
- Functions regarding correct usage of model
- Relatioship callers (calls relationship fetches in the DbTable to get parents or children rows)or returns cached data
DbTable
- Provides all static functions used to query data and instanciate the related Models such as :getById, getByName, getByComplexSearch, etc
- Provides all static relationship loaders such as: getParents, getChildrens and any other version you need
DataMapper
- Does the real meat and provides the getObjects method which accepts either a query part or a full query and loads the data into the ModelObjects and reads it back into a update, insert, delete query when needed
- Datamapper should be in charge of checking for relationship faults when inserting, updating or deleting using transactions if in InnoDB.
这有意义吗?
答案 1 :(得分:2)
我以前在我的系统上有findDependentRowset
。但不是了!在大多数情况下,这是浪费资源。表连接应该在您的SQL语句中。
请在此处查看我的回答:Hand made queries vs findDependentRowset
我还远离使用Doctrine或Propel(我从来不需要它)。也许有一天。(现在使用 Doctrine 2 。所以......我建议你现在一样)
在使用Zend Framework几年后,我遇到了以下架构:
1)我有一个抽象的映射器,我的所有映射器都扩展了它:Zf_Model_DbTable_Mapper
2)我也有一个抽象模型(域对象),类似于行数据网关,但它不是网关。它是一个通用的域对象:Zf_Model
3)填充对象图(SQL连接)时,一个映射器委托给负责给定对象的其他映射器。
示例强>
此方法来自抽象映射器:
public function getById($id)
{
$tableGateway = $this->getTable();
$row = $tableGateway->fetchRow('id =' . (int) $id);
if (!$row)
retur null;
$row = $row->toArray();
$objectName = $this->getDomainObjectName();
$object = new $objectName($row['id']);
$object->populate($row);
return $object;
}