symfony - 为什么 queryBuilder 中的 addSelect() 会改变我的查询结果
问题描述
我在实体存储库中有一个带有 ManyToMany 其他实体的查询:会议有很多用户
这是我的qb:
$userIds = [2];
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->leftJoin('mu.user', 'u')
->where('u.id IN (:ids)')
->setParameter('id', $userIds);
这很好用,如果我与两个用户开会并且 id=2 的用户在,那么查询会给出两个用户的完整结果。
我的问题是当我显示用户信息时我有很多数据库查询(84),所以我像这样使用 addSelect :
$userIds = [2];
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->addSelect('mu')
->leftJoin('mu.user', 'u')
->addSelect('u')
->where('u.id IN (:ids)')
->setParameter('id', $userIds);
伟大的 !我现在只有 16 个显示信息查询。 但是我的查询在我与两个用户的会议中只返回 id=2 的用户???
如果我只保留 addSelect('mu'),我也会遇到同样的问题。我认为 addSelect() 不会在不是我搜索的用户中执行。
如何使用 addSelect() 检索整个结果以减少查询?
感谢帮助
解决方案
您可以添加另一个 leftJoin 以按用户参加的会议进行过滤。这个 leftJoin 不会是 addSelect 的一部分,所以在原始的 addSelect 中,您将拥有所有用户参加每个会议
您可以将查询更改为:
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->addSelect('mu')
->leftJoin('mu.user', 'u')
->addSelect('u')
->leftJoin('mu.user', 'u_filter')
->where('u_filter.id IN (:ids)')
->setParameter('id', $userIds)
;
推荐阅读
- javascript - 如何在浏览器中使用 BASE64 键打开 PDF
- django - 从颤振发布后,获取代码 400 消息错误的请求语法
- node.js - Node.js:如何在自定义测试运行器中导入测试文件
- php - 在数据库中搜索而不考虑 MySql 和 Laravel 中的 HTML 标签
- preg-replace - 如何使用 preg_replace 删除空格 + hiphen + 空格以仅在 url slug 中使用 hiphen
- php - 如何调试这个 PHP 联系表单发件人?
- android - 如何修复 Android 导航图标大小问题
- c++ - int 函数返回值也没有返回
- c# - System.IO.Compression - 使用 ZipFileArchive 计算文件数非常慢
- javascript - JavaScript 中的 Thunk 和 currying 有什么区别?