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:使用左连接/分页进行限制 - 最佳实践 的相关文章

  • Doctrine2:入门教程“没有要处理的元数据类”

    我已经将本教程的第一部分运行了三遍 到目前为止 在这里或其他地方进行的大量搜索都无法帮助我使其发挥作用 我收到 没有要处理的元数据类 当我尝试时 php vendor bin doctrine orm schema tool update
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • Doctrine make:迁移未知数据库类型

    我正在尝试开始使用 Doctrine 但是在通过创建实体时遇到了问题php bin console make entity 然后我尝试进行迁移php bin console make migration但我收到此错误消息 请求未知的数据库类
  • 没有 Gem 的 Rails 分页

    我的任务是在不使用 gem 的情况下为 Rails 项目创建 前 10 个 后 10 个 最新 和 最旧 链接 在控制器中 我可以显示表中第一组 最新的 10 项 before action set page only index def
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • 数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?

    我试图理解不同的概念数据库分区这就是我的理解 水平分区 分片 将表拆分为不同的表 其中将包含初始表中的行的子集 如果按大陆拆分用户表 我见过很多这样的示例 例如北美的子表 欧洲的另一个子表 ETC 每个分区位于不同的物理位置 理解 机器 据
  • Doctrine2 与条件的关联映射

    是否可以与教义 2 4 中的条件进行关联映射 我有实体文章和评论 评论需要管理员批准 评论的批准状态存储在布尔字段 approved 中 现在我有 OneToMany 关联映射到实体文章中的评论 它映射了所有评论 但我只想映射批准的评论 就
  • 分页当前链接未突出显示

    我遇到了一个奇怪的问题 我当前的分页链接未突出显示 我制作的分页网址如下所示 site com list 50 some value 一切工作正常 但当前视图中的分页链接未突出显示 我检查了CSS 没问题 我猜问题出在库上 这是我的代码 我
  • Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合

    我正在使用 Doctrine 和这三个 相关 实体运行 Symfony 2 3 出版物 Author and 作者发表 Both Author and 出版物具有多对一关系作者发表 所以它基本上是一个多对多关系Author and 出版物但
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 带条件过滤的“IN”谓词不起作用

    我正在尝试直接过滤学说集合Criteria http docs doctrine project org en latest reference working with associations html filtering collec
  • 如何从数据库生成 Doctrine 实体并使用 PSR-4 自动加载?

    使用教义2 5使用 PSR 4 自动加载并将已设计的数据库模式转换为实体类 注释 问题是将导出的文件放入正确的目录结构中 作曲家 json autoload psr 4 Application src require doctrine or
  • 如何使用 Doctrine 实体创建测试而不保留它们(如何设置 id)

    我正在为 Symfony2 项目进行测试 现在我正在寻找一种方法来创建涉及实体对象的测试而不保留它们 问题是 id是一个私有字段 并且没有设置器 我可以创建新对象并设置一些属性 但我无法测试涉及的任何内容getId calls entity
  • 有什么方法可以在 Django 中序列化分页对象吗?

    我正在使用 Django 分页和 jQuery 我可以序列化分页对象的对象列表 但我想序列化整个对象以获取更多数据 页码 总页数 如何序列化整个分页对象 Thanks javascript function getRestaurants q
  • 如何检索标记某人的所有 Facebook 照片

    我知道您可以将限制和偏移值附加到 graph facebook com id photos API 调用中以对照片进行分页 但大的限制似乎效果不佳 照片最终会丢失 我在这里读到 limit 0 为您提供了所有照片 但照片又会丢失 那么您可以
  • Doctrine 自动递增起始值@ORM\GenelatedValue

    如何使用注释设置自动递增 id 的起始值 我希望它从 250000 开始 ORM Id ORM GeneratedValue ORM Column type integer protected id ORM Id ORM Generated
  • Cakephp-3.x:如何更改选定别名的数据类型?

    当我尝试这样做时 fields array id gt custom id title gt some name 我得到的结果有id作为字符串 If I do fields array custom id title gt some nam
  • SELECT、SELECT COUNT 和交叉引用表是否可以仅通过一个查询来处理?

    我有一个显示项目列表的页面 每个项目都会显示从 mysqli 数据库检索到的以下数据 Title Subtitle 描述 零件编号 x 中的 1 与该项目相关的照片总数 从项目中随机选择的照片 标签列表 使用分页系统每页显示 6 个项目 由
  • Doctrine2 findBy() 按连接表字段排序

    我将 Symfony2 与 Doctrine2 一起使用 有以下实体 Person ORM Entity repositoryClass Acme Bundle ConsysBundle Entity PersonRepository OR

随机推荐

  • 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