Php 数据映射器和zend框架

Php 数据映射器和zend框架,php,oop,zend-framework,datamapper,Php,Oop,Zend Framework,Datamapper,我正在我的Zend Framework web应用程序中实现数据映射器设计模式,一切都进行得很顺利,我非常喜欢在Zend中使用数据映射器,而不仅仅是应用Row Gateway模式,但我的体系结构存在问题。我不知道如何使用我的数据映射器以面向对象的方式引用和使用外键约束。 因此,我有我的模型类、DbTable类和Mapper类。我应该将所有外键关系放在DbTable类中,这样我就可以使用findDependentRowset()函数在映射器中检索,或者更好的方法是在映射器中实例化依赖类。使用数据映

我正在我的Zend Framework web应用程序中实现数据映射器设计模式,一切都进行得很顺利,我非常喜欢在Zend中使用数据映射器,而不仅仅是应用Row Gateway模式,但我的体系结构存在问题。我不知道如何使用我的数据映射器以面向对象的方式引用和使用外键约束。
因此,我有我的模型类、DbTable类和Mapper类。我应该将所有外键关系放在DbTable类中,这样我就可以使用
findDependentRowset()
函数在映射器中检索,或者更好的方法是在映射器中实例化依赖类。使用数据映射器模式映射外键的最佳OOP实践是什么?

我选择数据映射器,因为其他两个不应该知道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.

这有什么意义吗?

我以前在我的系统上有
findDependentRowset
。但现在不是了!在大多数情况下,这是对资源的浪费。表联接应该位于SQL语句中

请看我的回答:

我仍然远离使用教条或推进(我从来都不需要它)。也许有一天。(现在使用原则2。所以…我建议你现在也这样做)


旧答案 在使用Zend Framework几年后,我遇到了以下体系结构:

1) 我有一个抽象映射器,所有映射器都扩展了它:
Zf\u Model\u DbTable\u映射器

2) 我也有一个抽象模型(域对象),类似于行数据网关,只是它不是网关。它是一个通用域对象:
Zf_模型

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;    
    }

如果您有很多阻抗不匹配,请考虑使用ORM,如RealNo.2。我已经用数据映射器实现启动了这个项目,我遇到的唯一问题是处理外键映射,如果要实例化对象或让DbTable知道数据库模式实现是这样的:Model-与您所说的相同,但没有任何函数,只有用于访问模型属性DbTable的setter和getter-这里没有函数,只有子类化Zend_Db_Table_Abstract并提供表DataMapper的id和名称-meat-这里我有所有的函数,我检索DbTable类并设置模型类的属性我希望我的系统尽可能松散耦合,所以问题是我的应用程序中的外键关系