我目前有一个网站依赖于使用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模式,但仍有一些犹豫:
我不想只创建一个毫无意义的抽象层,只是简单地说明原始问题。
我不想在使用Active Record ORM的整个过程中重新创建或渲染无用。
有任何想法或建议吗?
答案 0 :(得分:1)
您需要在某个时刻使用对象包装器(数据访问对象),并且在某些时候您的调用将是实现(此处为Doctrine)特定的。它主要取决于你当前的架构,你想要介入多少层,但我会说 - 尽可能少。你有什么特定的问题,学说没有解决?
当使用ORM作为(从头开始)面向对象的域模型开发的工具时,我有时看不到必须处理数据库细节(例如,一个域实体在几个表上传播)的重点。 我最近answered a more Java specific question here,但也许它对建筑理念有帮助。
答案 1 :(得分:0)
您可以查看Zend Framework ORM implementation(如果您还没有),也可以定义relationships across multiple tables。
我希望有所帮助。