加入OneToMany关系

时间:2017-08-19 08:18:46

标签: doctrine one-to-many dql

我正在尝试查询具有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字段未从实体(占用者,dateDeparture)中的名称转换为其MySQL等效项(occupant_id,date_departure)
- 使用实体名称(MyBundle:Stay),不转换为SQL等价物(Stay)

我的其他查询工作完美,以及封装此查询的主要查询。

我也试图使用OneToMany关系来做这件事,因为有一个Occupant.stays关系,但我也无法使它工作。

这是我的座位班:

class Occupant
{
    ...

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

    ...

}

我的住宿课程:

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;

    ...
}

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

感谢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()
            )
        )
    ;