PHP datamapper - 为什么将它们用于非集合对象?

2024-01-02

也许这是一个答案微不足道的问题,但尽管如此,它还是让我发疯了几天,所以我想听到一个答案。我最近查找了大量与为我自己的项目构建自定义数据映射器(并且不使用 ORM)相关的信息,并阅读了 stackoverflow 或其他网站上的几个线程。

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

在此先感谢您的帮助。


简短回答

您无需费心创建两个映射器Author and AuthorCollection。如果你的程序不需要AuthorMapper and an AuthorCollectionMapper为了顺利工作并拥有干净的源,无论如何,做你最舒服的事情。

Note:选择这条路线意味着您应该格外小心SRP http://en.wikipedia.org/wiki/Single_responsibility_principle违规行为。


长(呃)答案

这完全取决于您想要做什么。为了这篇文章,让我们打电话AuthorMapper项目数据映射器和AuthorCollectionMapper集合数据映射器。

通常,项目映射器不会像其集合映射器那么复杂。项目映射器通常会only通过主键获取,从而限制结果,使映射器干净整洁,不受其他特定于集合的东西的影响。

One main part of these "collection-specific things" I bring up is conditions1 and how they're implemented into queries. Often within collection mappers you'll probably have more advanced, longer, and tedious queries than what would normally be inside an item data mapper. Though entirely possible to combine your average item data mapper query (SELECT ... WHERE id = :id) with a complicated collection mapper query without using a smelly condition2, it gets more complicated and still bothers the database to execute a lengthy query when all it needed was a simple, generic one.

此外,尽管您指出,使用项目映射器我们实际上只能通过主键获取,但使用项目映射器处理其他事情通常会变得更加简单。项目映射器save() and remove()方法可以比尝试使用集合映射器来保存/删除项目更好地处理(使用正确的实现)作业。而且,除了这一点之外,很明显,有时在使用集合映射器的过程中save() and remove()方法,集合映射器可能想要利用项目映射器方法。

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

1. Condition here means a property set on the collection instance which the collection mapper's query knows how to handle. If you haven't already, check out @tereško's https://stackoverflow.com/users/727208/teresko answer here https://stackoverflow.com/questions/11942842/who-should-handle-the-conditions-in-complex-queries-the-data-mapper-or-the-serv/11943107#11943107.
2. This condition is different and refers to the "evil if" https://stackoverflow.com/questions/1554180/why-is-the-if-statement-considered-evil people speak of. If you don't understand their nefariousness, I'd suggest watching some Clean Code Talks. This one http://www.youtube.com/watch?v=4F72VULWFvc specifically, but all are great.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP datamapper - 为什么将它们用于非集合对象? 的相关文章

随机推荐

  • 如何向 ggplot 添加数据标签

    尝试使用 ggplot 将数据标签添加到条形图时出现以下错误 Error geom text requires the following missing aesthetics x 我的样本数据如下 Team Goals Mancheste
  • 为什么当我离开并返回办公室网络时必须重新安装 MSMQ?

    我遇到了一个非常令人沮丧的问题 即使 MSMQ 已安装并启动 但它仍然不断拒绝工作 我在 Vista Business 笔记本电脑上安装了 MSMQ MSMQ Container MSMQ Server MSMQ Triggers MSMQ
  • 配置文件的 Rpm 升级处理

    我正在使用 rpm upgrade 命令 并注意到 rpm 有不同的方式来处理修改的配置文件 因此它不会在升级过程中丢失 据我了解 如果修改了配置文件并使用 rpm U 升级了软件包 rpm 会将原始属性文件重命名为 file rpmsav
  • 处理 TTN_LINKCLICK 消息后如何知道气球上点击了哪个链接?

    After 特拉马先生 https stackoverflow com users 960757 tlama已经回答了我的最后一个问题 如何捕获 TTN LINKCLICK 通知 https stackoverflow com questi
  • MVC4 捆绑:保存捆绑包 URL 的位置

    当bundle在MVC4中注册时 什么负责 拦截 传入的http要求 bundles someBundle v 1hDzBpmYJm4Iu OjRN1YqS1WeNThVl0kStLJGP8WCr41 另外 由于每个捆绑包的哈希值仅计算一次
  • Matplotlib 用颜色或形状区分平均值和中位数

    我正在使用 matplotlib 版本 1 4 3 我想制作一个 Violinplot 我想显示平均值和中位数 这很容易做到 但我想标记平均值和中位数 以便可以通过更改轻松区分它们其中之一的颜色和 或形状 但我在文档中看不到任何允许这样做的
  • 使用 PHP 的 Fedex SOAP API 请求多个跟踪号码

    我希望将所有 FedEx 跟踪信息缓存在我自己的数据库中 我的公司每天大约有 150 多个跟踪号码 根据这个链接 http www fedex com us developer product WebServices MyWebHelp A
  • 如何在 onReceive 计时器关闭 SwiftUI iOS 中导航另一个视图

    我试图在计时器达到特定时间时实现到另一个视图的导航 例如 我想在 5 分钟后导航到另一个视图 在 Swift 中 我可以轻松实现这一点 但我是 SwiftUI 的新手 非常感谢一些帮助 My code struct TwitterWebVi
  • Jetpack 使用多个可选参数组合导航

    https developer android com jetpack compose navigation optional args https developer android com jetpack compose navigat
  • Express.js sendFile 返回 ECONNABORTED

    在运行 Express js 3 8 6 的简单节点服务器上 我正在尝试使用sendFile向客户端发送一个简单的 HTML 文件 从读取的文件来看 该路径是正确的 浏览器上的缓存已禁用 显示的代码是 server js 文件 直接从节点运
  • 卸载活动 TCL Mac

    我正在尝试在 Mac 上卸载 Active TCL 但网站提供的代码不起作用 我收到错误消息 指出不是目录 当我查看代码提供的文件路径时 我可以手动查找 但它不起作用 还有其他方法可以摆脱这个吗 以下是提供的代码 cd Library Fr
  • 无法在 angularJs 中设置 DropDown 的选定值

    我有一个下拉菜单 我使用绑定它的值ng repeat在选项上 我想仅使用值字段设置选定的值 这是我的代码 div div
  • 有没有办法使用 ARM 模板创建 Azure 服务主体?

    我正在尝试编写一个 ARM 模板 该模板可以在 Azure 上创建具有所有指定权限的服务主体 最终目标是自动化此过程并使用模板创建 n 个服务主体 有没有办法做到这一点 非常感谢任何帮助 谢谢 正如 silent 所说 不可能通过 ARM
  • 动态规划矩阵链乘法

    我正在阅读动态规划中的矩阵链乘法 它有一个简单的递归解决方案 其运行时间呈指数级 http www geeksforgeeks org dynamic programming set 8 matrix chain multiplicatio
  • 如何在 WCF 中为非自定义绑定定义 maxReceivedMessageSize 时使用 ServiceRoutes

    编辑此内容以重新关注实际问题 我保留了消息底部的原始问题 但更改了标题和内容以反映实际发生的情况 我需要重写通过 ServiceRoute 机制添加到 MVC3 项目的 WCF 服务的 maxReceivedMessageSize 在 we
  • 为什么 230/100*100 不返回 230? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 的数学有问题吗 https stackoverflow com questions 588004 is javascripts math broken 在 Javascript
  • Flask-Admin 的访问控制

    我的 Flask 应用程序以基于 SQLAlchemy 修改模型为中心 因此 我发现 Flask admin 是一个很棒的插件 因为它将我的 SQLA 模型映射到已使用经过尝试和测试的可定制界面定义的视图的表单 我知道 Flask admi
  • 如何使 Android 中的 ListView 中的单元格在触摸时垂直展开和收缩?

    我在 ListView 中有一个单元格 里面有一堆文本 我显示前两行文本 如果超出则以 结束 我希望用户能够触摸单元格并使其在视图中动态扩展 显示所有数据 然后 当他们再次触摸细胞时 它会收缩回正常大小 我见过一个 iOS 应用程序可以做到
  • 在 MS Windows 中运行时 Gtk+ 图标丢失

    我有一个在 Ubuntu 上开发的 C GTK 应用程序 我想交叉编译它 以便它在 MS Windows 上运行 我跟着本指南 http www tarnyko net en q node 45设置编译器 程序编译成功 并在MS Windo
  • PHP datamapper - 为什么将它们用于非集合对象?

    也许这是一个答案微不足道的问题 但尽管如此 它还是让我发疯了几天 所以我想听到一个答案 我最近查找了大量与为我自己的项目构建自定义数据映射器 并且不使用 ORM 相关的信息 并阅读了 stackoverflow 或其他网站上的几个线程 这对