在查询生成器中访问加入的超类 objects
Access joined superclass objects inside query builder
我有一个工作加入 table 继承。
- 抽象超级class:人
- Subclasses: Parent 和 Child
在 ChildRepository 中,我想查询引用 Person class.
中的 object
Person.php:
<?php
[...]
/**
* @ORM\ManyToOne(targetEntity="User")
* @JoinColumn(name="id_user", referencedColumnName="id")
* @Assert\NotBlank
*/
private User $user;
[...]
例如,当我通过 findAll() 获取所有 Children 时,我可以获得他们的用户 object,因此连接有效(用户 object 是用户创建此数据库条目)。
现在我想统计一个用户创建的 children 的数量:
里面 ChildrenRepository.class:
$qb = $this->createQueryBuilder('c');
return $qb
->select('count(c.id)')
->where('c.user.id = :userid')
->setParameter('userid', $userId)
->getQuery()
->getSingleScalarResult();
这行不通吗?目前,为了让它起作用,我正在查询构建器中进行手动连接,但我认为没有必要。或者 doctrine 不会自动解析查询构建器级别的连接?
错误是:
Class App\Entity\Child has no field or association named user.id
编辑:我可能还可以做的是在 Person.class 中包含纯 $id_user。但是由于 object 已经存在,所以我没有在任何实体 class 中这样做。如果这是一个好习惯,我会这样做。至少摆脱连接。
您不能在 DQL 字段名称中使用多于一层的嵌套 (child.user.id
)(embedabbles 除外),您必须先 ->join('child.user', 'user')
然后引用 user.id
。
但如果是 id,则根本不必提及 .id
部分,只需使用 ->where('c.user = :userId')
.
这是因为 user_id
列已经存在于 person
table 中,并且从 SQL 角度来看不需要连接。
我有一个工作加入 table 继承。
- 抽象超级class:人
- Subclasses: Parent 和 Child
在 ChildRepository 中,我想查询引用 Person class.
中的 objectPerson.php:
<?php
[...]
/**
* @ORM\ManyToOne(targetEntity="User")
* @JoinColumn(name="id_user", referencedColumnName="id")
* @Assert\NotBlank
*/
private User $user;
[...]
例如,当我通过 findAll() 获取所有 Children 时,我可以获得他们的用户 object,因此连接有效(用户 object 是用户创建此数据库条目)。 现在我想统计一个用户创建的 children 的数量:
里面 ChildrenRepository.class:
$qb = $this->createQueryBuilder('c');
return $qb
->select('count(c.id)')
->where('c.user.id = :userid')
->setParameter('userid', $userId)
->getQuery()
->getSingleScalarResult();
这行不通吗?目前,为了让它起作用,我正在查询构建器中进行手动连接,但我认为没有必要。或者 doctrine 不会自动解析查询构建器级别的连接?
错误是:
Class App\Entity\Child has no field or association named user.id
编辑:我可能还可以做的是在 Person.class 中包含纯 $id_user。但是由于 object 已经存在,所以我没有在任何实体 class 中这样做。如果这是一个好习惯,我会这样做。至少摆脱连接。
您不能在 DQL 字段名称中使用多于一层的嵌套 (child.user.id
)(embedabbles 除外),您必须先 ->join('child.user', 'user')
然后引用 user.id
。
但如果是 id,则根本不必提及 .id
部分,只需使用 ->where('c.user = :userId')
.
这是因为 user_id
列已经存在于 person
table 中,并且从 SQL 角度来看不需要连接。