我正在尝试查询具有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;
...
}
谢谢你的帮助!
答案 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()
)
)
;