PHP数据映射器-为什么将其用于非集合对象?

PHP数据映射器-为什么将其用于非集合对象?,php,datamapper,Php,Datamapper,也许这是一个答案微不足道的问题,但这几天我都快发疯了,所以我想听听答案。我最近查阅了很多关于为我自己的项目构建自定义数据映射器的信息(不使用ORM),并阅读了stackoverflow或其他网站上的几个线程 对我来说,拥有AuthorCollection对象似乎非常有说服力,这些对象基本上只是Author实例的容器,或者BookCollection对象,它们包含多个Book实例。但是为什么要为单个作者对象使用映射器呢?我能想到的所有获取标准(除了请求具有指定BookID或AuthorID的对象)

也许这是一个答案微不足道的问题,但这几天我都快发疯了,所以我想听听答案。我最近查阅了很多关于为我自己的项目构建自定义数据映射器的信息(不使用ORM),并阅读了stackoverflow或其他网站上的几个线程

对我来说,拥有
AuthorCollection
对象似乎非常有说服力,这些对象基本上只是
Author
实例的容器,或者
BookCollection
对象,它们包含多个
Book
实例。但是为什么要为单个
作者
对象使用映射器呢?我能想到的所有获取标准(除了请求具有指定
BookID
AuthorID
的对象)都将返回多个
Book
Author
实例,因此
BookCollection
AuthorCollection
实例。那么,如果适当集合的映射器更通用,并且您不必确保您的条件只返回一个结果,那么为什么还要为单个对象使用映射器呢

提前感谢您的帮助。

简短回答 您无需为
Author
AuthorCollection
创建两个映射器。如果您的程序不需要
AuthorMapper
AuthorCollectionMapper
来顺利工作并获得干净的源代码,请务必执行您最熟悉的操作

注意:选择此路线意味着您应该格外小心,以防违规


长答案 这完全取决于你想做什么。为了这篇文章,让我们调用
AuthorMapper
项数据映射器和
AuthorCollectionMapper
集合数据映射器

通常,项目映射器不会像其集合映射器那样复杂。项目映射器通常只通过主键进行获取,因此会限制结果,从而使映射器因其他特定于集合的内容而变得干净整洁

我提出的这些“特定于集合的东西”的一个主要部分是条件1以及它们如何实现到查询中。通常,在集合映射器中,您可能会有比通常在项数据映射器中更高级、更长和繁琐的查询。虽然完全可以将平均项目数据映射器查询(
SELECT…WHERE id=:id
)与复杂的集合映射器查询相结合,而不使用难闻的条件2,但它会变得更加复杂,并且在只需要简单、通用的查询时仍会困扰数据库执行冗长的查询

此外,尽管您指出,使用项目映射器,我们实际上只通过主键获取,但使用项目映射器进行其他操作通常会变得非常简单。项目映射器的
save()
remove()
方法(使用正确的实现)可以比尝试使用集合映射器保存/删除项目更好地处理作业。除此之外,很明显,有时在使用集合映射器的
save()
remove()
方法的过程中,集合映射器可能希望使用项映射器方法

在回答下面的问题时,您可能多次需要设置从数据库中删除行集合的条件。例如,您可能有一个垃圾邮件标志,当设置该标志时,它会隐藏帖子,但会在30天内自毁。我相信在这种情况下,你很可能会有一个垃圾邮件标志和一个时间范围的条件。另一种可能是在答案被删除30天后删除答案下的所有评论。我之所以提到30天,是因为明智的做法是至少将这些数据保留一段时间,以防有人想要他们的评论,或者发现带有垃圾邮件标志的行实际上不是垃圾邮件

一,。这里的条件是指集合映射程序的查询知道如何处理的集合实例上的属性集。如果还没有,请查看答案。
2.这种情况是不同的,指的是人们所说的。如果你不理解他们的邪恶,我建议你看一些干净的代码对话。具体来说,但都很好


回答得很好。正如我对datamapper的“fetch”案例所说的那样,很明显,在“store”案例中,您得到了一个存储单个项的循环,这就减少了使用item datamapper。我认为,在“remove”的情况下,这实际上取决于您是否希望从数据库中删除单行(也称为item对象),这将再次导致使用item datamapper,或者您希望通过某种任意条件删除行。然而,我想不出最后一个例子。“你有这样一个案例吗?或者这个案例纯粹是学术性的吗?”马尔特伯曼,谢谢。对不起,哪一个是“最后提到的案例?”最后提到的案例是通过某种任意条件删除数据库中的行。我想不出一个例子,一个人必须使用这个。你知道吗?@MalteBehrmann我已经更新了我的帖子,看看最后一段。