数据映射器模式-如何通过非id字段选择对象


Data Mapper Pattern - How to select objects by non-ID fields?

我一直在做一个CMS项目(使用Zend框架)来提高我的技能,但遇到了一点困难。我很早就决定在处理数据库交互时采用数据映射器模式(http://martinfowler.com/eaaCatalog/dataMapper.html),因为业务模型和底层存储之间的逻辑很好地分离了。

我想要这种分离的一个例子是,域对象属性不一定与底层数据库列具有相同的名称(即有一个主键和外键的命名方案,有助于自动插入和延迟加载)。

我改编了以下教程&然而,我所看到的每个示例/示例/教程实现都完全忽略了在对象没有通过ID检索时如何处理检索。我一直在检查多种语言的教程,试图得到线索,但它们似乎都只处理插入,更新ID,删除ID & &;按ID选择!

我有几个问题,第一个问题是如何检索非主键字段?是为每个所需检索创建特定方法的常用方法,即。"实体-> findByName("鲍勃");'。从长远来看,这似乎非常僵化和笨拙。

如何检索数据库中具有不同名称的对象的属性?我一直在考虑有一个通用的选择方法,它需要3个参数(对象属性名称,修饰符嵌入在哪里子句,例如。'='或'>'以及要匹配的值)。但是我不认为这与数据映射器模式的相当严格的结构的想法是一致的。

谁能告诉我怎么做最好?有人见过这个吗?如果有,你是怎么做到的?

我知道存在像Doctrine这样的项目来处理这个问题,但我宁愿在这个时候开发一个"内部"解决方案。

拥有几个findByXXX()方法并不比在你的模型上为你的属性拥有getter和setter更严格。

对于数据库中具有不同名称的属性:以对象属性命名findBy方法,而不是以数据库列命名。毕竟,如果您的对象属性称为name,并且您有getName()setName()方法,则选择器方法称为getByName()是合乎逻辑的,即使实际的数据库列称为其他东西。