首页 > 解决方案 > 在查询构建器中访问连接的超类对象

问题描述

我有一个有效的连接表继承。

在 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 中。但由于对象已经存在,我没有在任何实体类中这样做。如果这是一个好的做法,我会这样做。至少摆脱加入。

标签: phpdoctrine-orm

解决方案


您不能在 DQL 字段名称中使用多于一层的嵌套 ( child.user.id)(嵌入除外),您必须先做->join('child.user', 'user'),然后再参考user.id

但如果是 id,您根本不必提及该.id部分,只需使用->where('c.user = :userId').

这是因为该user_id列已经存在于person表中,并且从 SQL 角度来看不需要连接。


推荐阅读