Doctrine2:使用左连接/分页进行限制 - 最佳实践

2023-12-31

我有一个大查询(在我的查询生成器中)和很多左连接。所以我得到带有评论和标签等的文章。 假设我有以下 dql:

$dql = 'SELECT blogpost, comment, tags 
FROM BlogPost blogpost 
LEFT JOIN blogpost.comments comments
LEFT JOIN blogpost.tags tags';

现在假设我的数据库有 100 多篇博文,但我只想要前 10 篇,但包含这 10 篇博文的所有评论及其所有标签(如果存在)。 如果我使用 setMaxResults 它会限制行。所以我可能会收到前两篇文章,但最后一篇缺少一些评论或标签。所以下面的方法不起作用。

$result = $em->createQuery($dql)->setMaxResults(15)->getResult();

使用几乎没有记录的分页 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/pagination.htmldoctrine2.2 附带的解决方案对我来说也不起作用,因为它太慢了,我还可以加载所有数据。

我尝试了中的解决方案Stackoverflow 文章 https://stackoverflow.com/q/10962802/532495,但即使那篇文章仍然缺少最佳实践,并且提出的解决方案速度非常慢。

没有关于如何做到这一点的最佳实践吗? 没有人在生产模式下使用 Doctrine2.2 吗?


使用这样的查询获得正确的结果是有问题的。 Doctrine 网站上有一个教程解释了这个问题。

分页 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/pagination.html

本教程更多的是关于分页而不是获取前 5 个结果,但总体思路是您需要执行“SELECT DISTINCT a.id FROMarticles a ... LIMIT 5”而不是普通的 SELECT。它比这更复杂一些,但是该教程中的最后两点应该会让您走上正轨。

Update:

这里的问题不是 Doctrine 或任何其他 ORM。问题完全在于数据库是否能够返回您所要求的结果。这就是连接的工作原理。

如果您对查询进行 EXPLAIN,它将为您提供有关正在发生的情况的更深入的答案。将其结果添加到您最初的问题中是个好主意。

根据分页文章中讨论的内容,您似乎需要至少 2 个查询才能获得所需的结果。在查询中添加 DISTINCT 可能会显着减慢查询速度,但只有在其中包含联接时才真正需要它。您可以编写另一个查询,仅检索按创建日期排序的前 10 个帖子,而不使用联接。一旦您获得了这 10 个帖子的 ID,请使用您的联接执行另一个查询,然后WHERE blogpost.id IN (...) ORDER BY blogpost.created。这种方法应该更有效。

SELECT 
    bp 
FROM 
    Blogpost bp 
ORDER BY 
    bp.created DESC
LIMIT 10

由于您在第一个查询中关心的只是 ID,因此您可以将 Doctrine 设置为使用标量水合。

SELECT 
    bg 
FROM 
    Blogpost bp 
LEFT JOIN 
    bp.comments c 
LEFT JOIN 
    bp.tags t 
WHERE 
    bp.id IN (...) 
ORDER BY 
    bp.created DESC

您也可以使用相关子查询在一个查询中完成此操作。子查询总是不好的神话是不正确的。有时它们比连接更快。您需要进行试验才能找出最适合您的解决方案。

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

Doctrine2:使用左连接/分页进行限制 - 最佳实践 的相关文章

随机推荐

  • C 标准是否允许为指针分配任意值并递增它?

    这段代码的行为定义是否明确 include
  • 如何将 Writer 转换为字符串

    Writer writer new Writer String data writer toString the value is not casting and displaying null 还有其他方法可以将 writer 转换为字符
  • Vue.js 无法切换字体很棒的图标

    我正在尝试根据布尔值切换很棒的字体图标 但看起来很棒的字体图标在绘制后仍保留在屏幕上 https jsfiddle net 50wL7mdz 200312 https jsfiddle net 50wL7mdz 200312 HTML
  • 实体框架 - Linq To 实体 - 多对多查询问题

    我在查询 Linq To Entities 中的多对多关系时遇到问题 我基本上尝试使用 Linq 复制此查询 Select FROM Customer LEFT JOIN CustomerInterest ON Customer Custo
  • 从 Play 框架 (Scala) 中的 play.api.mvc.Action[AnyContent] 获取响应正文

    我有以下 Play Scala 代码 object Experiment extends Controller routes file directs genki here def genki name String Action pipe
  • Worker调度算法

    问题 这就是我想要解决的问题的本质 我们有工作人员在周末的固定时间在托儿所照顾孩子 一个周末有 16 个不同的时段需要填补 因此 对于为期 4 周的月份 需要填补 64 个空缺 我们最多有 30 名托儿所工人 尽管我们需要更多 有人喜欢孩子
  • 有没有办法在没有模型的情况下使用 formattastic 创建表单?

    我想使用 formattastic 来创建表单 但我没有与之相关的模型 带有用户名 密码和 openid URL 的登录表单 当然 我可以创建一个模型来做到这一点 但该模型只是一个黑客 其中没有任何有用的代码 您可以传递字符串而不是模型 它
  • paypal平行支付和链式支付的区别

    我需要实现一个支付网关 用户可以通过该网关在一笔交易中向两个卖家付款 所以我尝试了贝宝的两种选择 Paypal 并行支付 Paypal 链式支付 虽然两者都完美地满足了我的需求 但我很想知道哪一种更适合我的需求以及两种方法之间的区别 我还想
  • 大文本语料库破坏 tm_map

    在过去的几天里 我一直在为这个问题伤透脑筋 我搜索了所有 SO 档案并尝试了建议的解决方案 但似乎无法让它发挥作用 我在 2000 06 1995 99 等文件夹中有一组 txt 文档 并且想要运行一些基本的文本挖掘操作 例如创建文档术语矩
  • 带有 BigQuery 分区表的 BigQuery 数据传输服务 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我可以访问 BigQuery 中的一个项目 我希望按摄取时间创建一个分区表 按天分区 然后设置一个 BigQuery 数据传输流程
  • MySQL全文检索布尔模式混乱

    当尝试在布尔模式下使用全文搜索设置搜索时 我有点困惑 这是我正在使用的查询 query SELECT MATCH title AGAINST q IN BOOLEAN MODE AS score FROM results WHERE MAT
  • GAS 不允许在 Team Drive 中以编程方式创建可安装的触发器

    我的公司一直在尝试使用 G Suite 将我们的流程转移到线上 由于某种原因 GAS 不允许我以可编程方式设置触发器并返回 异常 不允许操作 请参见下面的屏幕截图 1 3 请求授权 1 SO 不允许我发布两个以上的链接 这是一个屏幕截图 告
  • xcode 6 对象库为空(没有匹配项)

    我正在尝试按照说明创建 Hello World 但我的对象库中似乎没有任何内容 它只是在对话框中显示 没有匹配项 我在这里缺少什么 谢谢 我发现了一个解决方案 当我在助理编辑器中编辑情节提要时 就发生了这种情况 我关闭了助理编辑器并在主编辑
  • Javascript:从外部 CSS 文件中删除媒体查询

    如何删除从外部 css 文件加载的媒体查询 请注意 我无法禁用整个链接标记 因为该媒体查询中包含其他重要样式 body container media min width XXXpx 谢谢你 我强烈推荐纯 CSS 解决方案来解决这个问题 例
  • 如何删除应用程序快捷方式图标中的徽章?

    How to remove the badge in app shortcut icon in android When i create app shortcut programmatically along with the icon
  • Boost Asio async_wait 处理程序

    升压asiodeadline timer async wait函数正在采用以下形式的处理程序 void handler const boost system error code error 我如何定义一个处理程序来接收const boos
  • 为什么要创建自定义异常? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么我们需要创建自定义异常 NET 特定的自定义异常允许您为 catch 语句隔离不同的错误类型 异常处理的常见结构是这样的 try catc
  • 类似热图的图,但适用于分类变量

    我为大约 50 个人中的每一个设定了三个因子 集合 1 集合 2 和集合 3 set1 set2 和 set3 的值为 A B C 我想对这些数据制作一个类似热图的图 但让图例显示与值相关的颜色 例如 A 红色 B 蓝色 C 黑色 有什么建
  • 单独的 js 文件中的 getElementById 找不到 ASP.net 控件

    当我在页面标记中有这个时 它工作正常 但是当我在一个单独的文件中有相同的东西时 即使该函数is已执行 的值v遗迹null 我尝试用一 个简单的div and it did找出div 为什么找不到 ASP net 按钮 EDIT 我什至添加了
  • Doctrine2:使用左连接/分页进行限制 - 最佳实践

    我有一个大查询 在我的查询生成器中 和很多左连接 所以我得到带有评论和标签等的文章 假设我有以下 dql dql SELECT blogpost comment tags FROM BlogPost blogpost LEFT JOIN b