2017-08-19 111 views
0

我想用OneToMany关系查询一个实体,但它不起作用,因为子查询DQL没有很好地转换。加入OneToMany的关系

我希望这个代码:

$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等效的逗留)

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

我也尝试使用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

请,你的实体类添加到这个问题。如果您的实体字段名称与数据库中的属性名称不同,那么您必须在实体类中使用注释来将文件“连接”到正确的属性。 – PeMaCN

+0

我已经更新了与实体的问题 – Cryborg

回答

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