3

我目前有一个使用 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 的全部意义。

有什么想法或建议吗?

4

2 回答 2

1

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

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

于 2009-08-05T14:32:03.803 回答
0

您可以查看Zend Framework ORM 实现(如果您还没有的话),其中还可以定义跨多个表的关系

我希望这会有所帮助。

于 2009-08-05T14:23:15.033 回答