php - 在查询构建器中访问连接的超类对象
问题描述
我有一个有效的连接表继承。
- 抽象超类:人
- 子类:父母和孩子
在 ChildRepository 内部,我想进行一个查询,该查询引用 Person 类中的对象。
人.php:
<?php
[...]
/**
* @ORM\ManyToOne(targetEntity="User")
* @JoinColumn(name="id_user", referencedColumnName="id")
* @Assert\NotBlank
*/
private User $user;
[...]
例如,当我通过 findAll() 获取所有 Children 时,我可以获得他们的 User 对象,因此连接有效(User 对象是创建此数据库条目的用户)。现在我想计算一个用户创建的孩子的数量:
在 ChildrenRepository.class 内部:
$qb = $this->createQueryBuilder('c');
return $qb
->select('count(c.id)')
->where('c.user.id = :userid')
->setParameter('userid', $userId)
->getQuery()
->getSingleScalarResult();
这不应该工作吗?目前,为此,我正在查询构建器中进行手动连接,但我认为没有必要。或者学说不会自动解决查询构建器级别的连接?
错误是:
类 App\Entity\Child 没有名为 user.id 的字段或关联
编辑:我可能还可以将普通的 $id_user 包含在 Person.class 中。但由于对象已经存在,我没有在任何实体类中这样做。如果这是一个好的做法,我会这样做。至少摆脱加入。
解决方案
您不能在 DQL 字段名称中使用多于一层的嵌套 ( child.user.id
)(嵌入除外),您必须先做->join('child.user', 'user')
,然后再参考user.id
。
但如果是 id,您根本不必提及该.id
部分,只需使用->where('c.user = :userId')
.
这是因为该user_id
列已经存在于person
表中,并且从 SQL 角度来看不需要连接。
推荐阅读
- php - 如何使用 laravel 以相同的顺序从 mysql 获取?
- r - 如何使用 R 包 srvyr 执行多个 t.tests?
- scala - T <: A,返回T方法
- amazon-web-services - AWS Timestream:无法将记录摄取到 AWS Timestream
- c - 使用 Doxygen 创建 Graphviz 图时出错
- r - R中的数值微分
- r - 有什么作用。(点)在 ~replace_na(., 0) 中的意思
- postgresql - Postgres - 复制命令
- c - 需要 memset 全局字符串或全局结构中的字符串
- laravel - Laravel 和上传图片超过 2MB