加入 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()
)
)
;
我正在尝试查询具有 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()
)
)
;