加入 OneToMany 关系

Join with OneToMany relation

我正在尝试查询具有 OneToMany 关系的实体,但它不起作用,因为子查询 DQL 未正确转换。

我期待这段代码:

$subquery = $manager->createQueryBuilder();
$subquery
    ->select('s.occupant')
    ->from('MyBundle:Stay', 's')
    ->where('s.dateDeparture IS NULL')
;

$qb
    ->where($qb->expr()->notIn('o.id', ':subQuery'))
    ->setParameter('subQuery', $subquery->getDQL())
;

生产:

WHERE o0_.id NOT IN (
    SELECT s.occupant_id FROM Stay s WHERE s.date_departure IS NULL
)

但是,我有这个:

WHERE o0_.id NOT IN (
    'SELECT s.occupant FROM MyBundle:Stay s WHERE s.dateDeparture IS NULL'
)

问题如下:
- 子查询封装在逗号
之间 - SQL 字段未从它们在实体中的名称(乘员、日期出发)转换为它们的 MySQL 等效项(occupant_id、date_departure)
- 使用实体名称 (MyBundle:Stay) 并且未转换为其 SQL 等价物 (Stay)

我的其他查询以及封装此查询的主查询都运行良好。

我也尝试使用 OneToMany 关系来做到这一点,因为有一个 Occupant.stays 关系,但我也无法让它工作。

这是我的乘员 class :

class Occupant
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="EmmausBundle\Entity\Stay", mappedBy="occupant", cascade={"persist"})
     * @ORM\OrderBy({"dateArrival" = "DESC"})
     */
    private $stays;

    ...

}

我的住宿 class :

class Stay
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="Occupant", inversedBy="stays")
     * @ORM\JoinColumn(name="occupant_id", referencedColumnName="id")
     */
    private $occupant;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_departure", type="datetime", nullable=true)
     */
    private $dateDeparture;

    ...
}

感谢您的帮助!

感谢 this answer 我找到了解决方案 :

$qb
    ->where(
        $qb->expr()->notIn(
            'o.id',
            $manager->createQueryBuilder()
                ->select('IDENTITY (s.occupant)')
                ->from('EmmausBundle:Stay', 's')
                ->where('s.dateDeparture IS NULL')
                ->getDQL()
            )
        )
    ;