php - *特别是*,是什么让 DataMapper 比 ActiveRecord 更灵活?

标签 php database orm datamapper

我正在比较 Doctrine 2 and Propel 1.5/1.6 ,我正在研究他们使用的一些模式。 Doctrine 使用 DataMapper 模式,而 Propel 使用 ActiveRecord 模式。虽然我可以看到 DataMapper 相当更复杂,但我认为这种复杂性会带来一些设计灵 active 。到目前为止,我发现在 ActiveRecord 上使用 DataMapper 的唯一合理原因是 DataMapper 在单一责任原则方面更好——因为数据库行不是被持久化的实际对象,但 Propel 并不是这样让我担心,因为它无论如何都是生成的代码。

那么——是什么让 DataMapper 更加灵活?

最佳答案

我使用过新的 Propel 和 Doctrine2。 DataMapper(我的意思是 Doctrine2)的可爱之处在于您的域对象干净简单,它们不会扩展不相关的类,这些类会向您的类添加许多不相关的方法(如您所说,违反了 SRP)。它们只是具有一些属性和一些方法的简单实体,它们是业务层的一部分。而且,当然,您可以为它们编写单元测试并在将来重用它们。

我不会说 DataMapper 复杂得多。如果您编写自己的 DataMapper 实现会很复杂,但是 Doctrine2 比 propel 更容易使用(也许除了设置它,我们只做一次)。它有一个实体管理器来操纵任何实体。您可能拥有用于复杂查询的实体存储库。就是这样。

一个实体很简单:

/**
 * Question
 *
 * @Entity
 */
class Question
{
    /**
     * @Column(type="string")
     */
    private $title;

    public function getTitle() { return $this->title; }
    public function setTitle($title) { $this->title = $title; }

}

在 Propel 中,我们将为该实体提供 6 个类,其中包含大量生成的且通常未使用的代码。

是什么让 DataMapper 更加灵活?它提供的简单性。

关于php - *特别是*,是什么让 DataMapper 比 ActiveRecord 更灵活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032892/

相关文章:

php - mac 上的 XAMPP 安装问题//bitnami-first-boot-123456

php - mysql 触发器是否会为 select 语句产生额外的开销?

php - Symfony/Doctrine : getJoinTableName() must be of the type array, 给定为空

php - sql代码显示每个类别中具有多个最大值的类别的最大值?

php - 为什么我对 PHP 脚本/WP REST API 的并发 AJAX 请求如此慢?

php - 在 foreach PHP 中使用 echo 时添加字符串

javascript - 当用户单击 'submit' 按钮时捕获信息到日志文件

mysql - 如何使我的查询正常工作(查询多个表)

php - 如何使用关系在laravel数据库中插入嵌套的二维数组

java - hibernate 和继承(TABLE_PER_CLASS)