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

时间:2011-07-11 05:34:42

标签: php select zend-framework datamapper

我一直致力于一个CMS项目(使用Zend Framework)来提升我的技能并且打了一个墙。由于业务模型和底层存储之间的逻辑分离很好,我在处理数据库交互时很早就决定采用数据映射器模式(http://martinfowler.com/eaaCatalog/dataMapper.html)。

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

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

所以我有几个问题,第一个问题是你将如何检索非主要关键字段?是每次所需检索创建特定方法的常用方法,即'$ entity-> findByName('Bob');'。从长远来看,这似乎非常僵硬和笨拙。

如何在数据库中检索具有不同名称的对象上的属性?我一直在考虑使用一个泛型select方法,它接受3个参数(对象属性名称,嵌入where子句的修饰符,例如'='或'>'和要匹配的值)。但我不认为这与数据映射器模式的相当严格的结构有关。

任何人都可以建议如何最好地继续进行?有没有人遇到这个&如果是的话,你是怎么做到的?

我知道像Doctrine这样的项目可以解决这个问题,但我现在宁愿开发一个“内部”解决方案。

1 个答案:

答案 0 :(得分:4)

使用几个findByXXX()方法并不比在您的属性上使用模型上的getter和setter更加严格。

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