2017-08-19 152 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() 
      ) 
     ) 
    ;