当 Doctrine 查询具有连接时,setMaxResults 无法正常工作

2024-02-29

我想编写一个 DQL 查询来选择发布并加入另一个实体。

这是我的代码:

   $dql = '
                    SELECT p , h ,t ,m 
                    FROM App:Post p 
                    LEFT JOIN p.mentions m
                    LEFT JOIN p.tags t 
                    LEFT JOIN p.file h 
                    WHERE p.user
                    IN (
                        SELECT f FROM App:User u
                        JOIN u.followers f
                        WHERE u.id = :uid
                       )
                    OR p.user = :uid ';

    $query = $this->getEntityManager()
        ->createQuery($dql)
        ->setMaxResults(5)
        ->setParameters(['uid' => $user->getId()])
        ->getArrayResult();

但问题是setMaxResults不限制帖子实体,而是限制 5 上的标签实体。

这是我的两种结果:

1.with setMaxResults(不能正常工作) https://jsoneditoronline.org/?id=71f2c51769504b5ca14d3c4624ef68a1

2.with setMaxResults(工作正常) https://jsoneditoronline.org/?id=aad5dc17594a46e7bbaed27eb5187bb5

我的代码有什么问题吗?


这是预期的行为在原则上使用时设置最大结果() or 设置第一个结果()没有分页器。

设置最大结果()实际上是添加一个SQL限制对于生成的查询,它不仅会像您期望的那样限制根实体,还会限制查询返回的行。这意味着在连接查询时它不会执行您想要的操作。

根据第一个和最大结果项 https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#first-and-max-result-items-dql-query-only

如果您的查询包含指定结果限制方法的 fetch-joined 集合,则该方法不会按您的预期工作。设置最大结果限制数据库结果行的数量,但是在提取连接集合的情况下,一个根实体可能会出现在许多行中,从而有效地混合少于指定数量的结果。

为了达到你想要的目的,你可以做的是使用分页器 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/pagination.html根据您的查询:

$query = $this->getEntityManager()
    ->createQuery($dql)
    ->setMaxResults(5)
    ->setParameters(['uid' => $user->getId()]);
$paginator = new Paginator($query, $fetchJoinCollection = true);

$c = count($paginator);
foreach ($paginator as $post) {

}

从上面的分页器文档链接:

对 Doctrine 查询进行分页并不像您一开始想象的那么简单。如果您有具有一对多或多对多关联的复杂 fetch-join 场景,则使用数据库供应商的“默认”LIMIT 功能不足以获得正确的结果。

另请注意:

默认情况下,分页扩展执行以下步骤来计算正确的结果:

  • 使用执行计数查询DISTINCT关键词。
  • 执行限制子查询DISTINCT查找当前页面中实体的所有 id。
  • 执行 WHERE IN 查询以获取当前页面的所有结果。

仅当您实际获取连接到多对集合时,此行为才是必要的。您可以通过将 $fetchJoinCollection 标志设置为 false 来禁用此行为;在这种情况下,仅执行 2 个查询,而不是所描述的 3 个查询。我们希望将来能对此进行自动化检测。

类似问题 https://stackoverflow.com/questions/14884183/doctrine-querybuilder-limit-and-offset

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

当 Doctrine 查询具有连接时,setMaxResults 无法正常工作 的相关文章

  • 如何在 json 中输出 javascript 日期

    我正在尝试时间线图表 http code google com apis visualization documentation gallery annotatedtimeline html Data Format http code go
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • PHP 异常处理与 C#

    这是一个非常基本的问题 我希望如此 我所做的大部分异常处理都是使用 C 进行的 在 C 中 任何在 try catch 块中出错的代码都会由 catch 代码处理 例如 try int divByZero 45 0 catch Except
  • Codeigniter PHP - 在锚点加载视图

    我在一个长页面的底部有一个表单 如果用户填写了表单但它不验证页面是否以典型的 codeigniter 方式重新加载 this gt load gt view template data 然而 由于表单位于页面底部 我需要将页面加载到那里 就
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • 使用 PHP 更新 XML 节点

    我有一个 XML 文件 test xml
  • 如何在没有 session_destroy 的情况下销毁 Zend_Session_Namespace

    我使用以下方法在临时会话中存储一些值 job new Zend Session Namespace application 我如何只销毁会话应用无需清除所有会话 要从会话中删除值 请对对象属性使用 PHP 的 unset 函数 假设 job
  • 在php中获取大于2GB的文件大小的最佳方法?

    我想检查本地驱动器上的文件大小windows OS 但是PHP原生函数filesize 仅当文件大小小于时才有效2GB 大于的文件2GB将返回错误的数字 那么 是否有其他方法来获取大于的文件大小2GB 非常感谢 您始终可以使用系统的文件大小
  • PHP 电子邮件验证[重复]

    这个问题在这里已经有答案了 For PHP最好的电子邮件验证方法是什么preg NOT ereg因为它是已弃用 删除 I don t需要检查该网站是否存在 这不像最高安全性 我找到了很多方法ereg但它们 显然 不是好的做法 我建议你使用F
  • PHP 中的静态类初始值设定项

    我有一个带有一些静态函数的辅助类 类中的所有函数都需要一个 重 初始化函数来运行一次 就好像它是一个构造函数 有实现这一目标的良好实践吗 我唯一想到的就是打电话init函数 如果它已经运行过一次 使用静态 initialized变种 问题是
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • php隐藏所有错误[重复]

    这个问题在这里已经有答案了 隐藏的最佳做法是什么allPHP 错误 因为我不想向用户显示错误 我尝试过使用 htacess通过输入代码php flag display errors off在那里 但它返回给我一个500 error 还有其他
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 错误 #520009 - 帐户受到限制

    我收到 520009 错误 帐户 电子邮件受保护 cdn cgi l email protection被限制 当尝试进行并行付款时 我的代码使用沙箱运行良好 但我切换到实时端点 它开始失败 有问题的帐户是有效的 PayPal 帐户 我使用的
  • 通过 post 使用 php 发送 XML

    我知道有很多类似的问题 但我尝试过摆弄所有的解决方案 但似乎无法使其发挥作用 我正在尝试将 xml 直接发布到 Web 服务并获得响应 从技术上讲 我正在尝试连接到freightquote com 您可以在右上角找到该文档this http
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • 细胞的 fpdf 对齐

    我正在尝试使用生成 PDFfpdf我有一个小问题 我需要有 2 个单元格 如下所示 Address Line 1 Version Address Line 2 1 0 City 06 05 2011 我尝试过使用MultiCell 但没有运
  • PHP 中的异或加密

    我是 Xor 加密的新手 并且在使用以下代码时遇到了一些问题 function xor this string Let s define our key here key magic key Our plaintext ciphertext
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时

随机推荐

  • 每个Python函数最后都必须返回吗? [复制]

    这个问题在这里已经有答案了 所以我正在制作递归函数的图表来让我的头脑围绕递归 我注意到显然每个函数都在最后执行 return 还有一个问题 函数到底返回什么 传递给它的所有参数 假设有多个参数 或者某种价值 t只是执行实际绘图的实体 def
  • 是否可以使用 django 模型将数组存储在 mysql 数据库中?

    我有一个值数组并想存储在mysql数据库使用django模型 py 我可以通过哪些方式存储数组值 在 的帮助下django mysql我们可以将列表存储到数据库中 为此你必须安装 django mysql pip install djang
  • 如何使用 ggplot2 在直方图条上显示百分比标签

    我看到很多关于将 y 轴上的计数转换为百分比的问题 但其中必须在条形图中 我想在直方图中做类似的事情 但无法清楚地显示条形图上的标签 请告诉我我哪里做错了 x runif 100 min 0 max 10 data1 lt data fra
  • 从 .git 文件夹恢复整个项目[重复]

    这个问题在这里已经有答案了 我有一个网络项目 我已经工作了一段时间了 我使用 GIT 和 SourceTree 来跟踪更改 但愚蠢地没有适当的备份 我有大约 50 次提交 想要清理干净并从新的初始状态开始 所以我删除了 git 文件夹 但是
  • 强类型 ActionLink 的注意事项

    我一直在尝试查找有关 Futures 中首次亮相的强类型 ActionLink 辅助方法的更多信息 我知道使用它有一些很大的缺点 但想了解更多 我发现的最好的链接是这个 Asp Net MVC 2 中的强类型 ActionLink http
  • laravel uuid 作为主键

    我正在尝试将 uuid 设置为 Laravel 模型中的主键 我已经完成了在我的模型中设置启动方法的工作here https github com webpatser laravel uuid所以我不必每次想要创建和保存模型时都手动创建它
  • 通过 mutableCopy 或 arrayWithArray 创建带有文字的 NSMutableArray:[重复]

    这个问题在这里已经有答案了 可能的重复 NSMutableDictionary 的字面创建是否比类帮助器方法效率低 https stackoverflow com questions 12426786 is literal creation
  • java 中的 PHP 相似文本()

    你知道 PHP 的任何严格等效的实现吗相似文本 https www php net manual en function similar text phpJava 中的函数 这是我在java中的实现 package comwebndesig
  • Wix:如何设置文件夹和所有子文件夹的权限

    我知道如何设置文件夹的权限
  • LINQ“无法检测到以下存储过程的返回类型”(不是临时表)

    长期潜伏者 第一次在这里发帖 我决定在这里问 因为我已经厌倦了在谷歌等搜索 将存储过程从 SQL 2005 DB 导入到网站 FW 4 0 C LINQ 项目时 我遇到此错误 无法检测到以下存储过程的返回类型 我有两个疑问 我想指出的是 我
  • 我的页脚浮动

    在三天的大部分时间里 我一直在尝试各种 粘性 页脚解决方案 但没有成功 当没有足够的内容来跨越窗口的整个高度时 我试图将页脚放置在浏览器窗口的底部 请 帮助 这是基本的网站结构 div div
  • 在 dotnetcoreapp2.0 中使用 UnobservedTaskException 处理程序

    以下代码在 netcoreapp2 0 应用程序中运行时 似乎最终不会抛出UnobservedTaskException using System using System Threading using System Threading
  • 如何从文本中查找数字

    这是我的数据框中 pyspark 列 字符串 的一个小示例 column new column Hoy es d a de ABC KE98789T983456 clase
  • Gulp.js - 在连接时重写嵌入在 css 中的 url

    我正在使用 Gulp 连接来自不同目录的多个 css 文件 Bower 管理的依赖项 Font awesome 是这些依赖项之一 它包含对其字体的相对引用url font 当 css 文件连接并放置在不同的目录中时 这个相对 url 显然是
  • 为什么依赖属性中的 get/set 没有执行任何操作?

    我创建了一个像这样的依赖属性 public partial class MyControl UserControl public static DependencyProperty XyzProperty DependencyPropert
  • 如何将密码显示为星号[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个登录窗口 提示用户输入用户名和密码 尽管输入密码时我正在寻找要打印的星号 例如常见的密码输入 即 Sekr3t 回显为 这是我到目前为止的代码 我不明白为什么它不回显星号 import msvc
  • 一个好的、免费的、简单的、非“试用”的本地 SMTP 服务器用于开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DAX 条件总和

    如何构造返回 A 或 B 之和的 DAX 度量 逻辑是如果 A 为空 则取 B 所以预期的结果如下所示 A B Expected 1 1 1 1 2 2 1 2 1 2 2 3 6 7 当我使用测量时 Measure IF ISBLANK
  • Spark编程中什么时候应该使用groupByKey API?

    GroupByKey 会遭受数据混洗的困扰 而 GroupByKey 功能可以通过使用 mergeByKey 或 reduceByKey 来实现 那么什么时候应该使用这个 API 有使用案例吗 组合和减少最终也会进行洗牌 但它们具有更好的内
  • 当 Doctrine 查询具有连接时,setMaxResults 无法正常工作

    我想编写一个 DQL 查询来选择发布并加入另一个实体 这是我的代码 dql SELECT p h t m FROM App Post p LEFT JOIN p mentions m LEFT JOIN p tags t LEFT JOIN