在查询生成器中访问加入的超类 objects

Access joined superclass objects inside query builder

我有一个工作加入 table 继承。

在 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 角度来看不需要连接。