【问题标题】:PHP data access design patterns to complement an ORM补充 ORM 的 PHP 数据访问设计模式
【发布时间】:2009-08-05 13:54:48
【问题描述】:

我目前有一个使用 PHP 中的 Doctrine ORM 依赖于 Active Record 模式的站点。我通常是这种方法的粉丝——它非常简单,非常适合管理简单的 CRUD 应用程序。但是随着这个站点的增长,我认为我对更强大的域功能的需求也会增长。我想知道还有哪些其他类型的数据设计模式可以很好地与 ORM 结合使用。

我现在的基本问题是,Doctrine 似乎最适合作为一种花哨的查询语言,所以我的模型到处都是这样的方法:

function getBySomeClassfication($classification)
{
    return Doctrine_Query::create()
              ->select('stuff')
              ->from('ModelClass')
              ->where('something = ?', $classification)
              ->execute();
}

或者如果我想直接访问模型类:

Doctrine::getTable('ModelClass')->findAll();

这意味着我最终使用 Doctrine 的对象包装器而不是直接在我的域对象上工作。我觉得所有这些都应该存在于较低的抽象层次上。

我只是不太确定最好的方法是什么。我觉得 ORM 是查询单个表和处理关系的绝佳层。但我希望在创建跨多个模型/表工作的域对象方面具有更大的灵活性。

我已经阅读了有关使用存储库模式的信息,但仍有一些犹豫:

  1. 我不想仅仅创建一个无意义的抽象层,简单地将原始问题冒泡。

  2. 我不想重新创建或使使用 Active Record ORM 的整个意义变得无用。

有什么想法或建议吗?

【问题讨论】:

    标签: php design-patterns activerecord doctrine


    【解决方案1】:

    您需要在某些时候使用对象包装器(数据访问对象),并且在某些时候您的调用将是特定于实现(此处为 Doctrine-)的。这主要取决于您当前的架构,您想要在它们之间放置多少层,但我会说 - 尽可能少。你有什么具体问题是 Doctrine 没有解决的吗?

    当使用 ORM 作为(从头开始)面向对象的领域模型开发的工具时,我有时根本看不到必须处理数据库细节(例如,一个域实体分布在多个表上)的意义。 我最近answered a more Java specific question here,但也许它对你也有帮助,对于架构理念。

    【讨论】:

      【解决方案2】:

      您可以查看Zend Framework ORM implementation(如果您还没有),也可以在其中定义relationships across multiple tables

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 2010-11-06
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多