PHP数据访问设计模式以补充ORM

时间:2009-08-05 13:54:48

标签: php design-patterns activerecord doctrine

我目前有一个网站依赖于使用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是查询单个表和处理关系的绝佳层。但我希望能够更灵活地创建跨多个模型/表格的域对象。

我已经阅读了使用Repository模式,但仍有一些犹豫:

  1. 我不想只创建一个毫无意义的抽象层,只是简单地说明原始问题。

  2. 我不想在使用Active Record ORM的整个过程中重新创建或渲染无用。

  3. 有任何想法或建议吗?

2 个答案:

答案 0 :(得分:1)

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

当使用ORM作为(从头开始)面向对象的域模型开发的工具时,我有时看不到必须处理数据库细节(例如,一个域实体在几个表上传播)的重点。 我最近answered a more Java specific question here,但也许它对建筑理念有帮助。

答案 1 :(得分:0)

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

我希望有所帮助。