2017-03-18 63 views
0

我在Symfony中遇到問題。我有兩個實體具有一對多的關係:如何在排除某個日期的元素的OneToMany關係中創建DQL查詢?

/** 
* Field 
* 
* @ORM\Table(name="field") 
* @ORM\Entity(repositoryClass="MyBundle\Repository\FieldRepository") 
*/ 
class Field 
{ 
    . 
    . 
    . 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(targetEntity="Booking", mappedBy="field", cascade={"remove","persist"}) 
    */ 
    private $bookings; 

和:

/** 
* Booking 
* 
* @ORM\Table(name="booking") 
* @ORM\Entity(repositoryClass="MyBundle\Repository\BookingRepository") 
*/ 
class Booking 
{ 
    . 
    . 
    . 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date", type="datetime", nullable = true) 
    */ 
    private $date; 

    /** 
    * @ORM\ManyToOne(targetEntity="Field", inversedBy="bookings") 
    * @ORM\JoinColumn(name="field_id", referencedColumnName="id") 
    */ 
    private $field; 

而且我想這是免費的(預訂)在某一特定日期的字段。我嘗試這樣做:

public function findFreeFields($date){ 

     $em = $this->getEntityManager(); 

     $queryText = "SELECT f, FROM MyBundle:Field f JOIN f.bookings b "; 
     $queryText .= "WHERE b.date!=:date"; 

     $query = $em->createQuery($queryText); 
     $query->setParameter('date', $date); 
     return $query->getResult(); 

的問題是,如果,例如,我有一個名爲「字段1」與4個預訂和預訂者之一是日期20/05/2017領域。我在那天查找所有的字段(2017年5月20日)和findFreeFields(),但是我重複了三次「field1」,這顯然是錯誤的。 「field1」不能在結果列表中,因爲它在指定的日期被預訂。

用DISTINCT我沒有得到重複的結果,但仍然在結果中得到「field1」。

public function findFreeFields($date){ 

     $em = $this->getEntityManager(); 

     $queryText = "SELECT DISTINCT f, FROM MyBundle:Field f JOIN f.bookings b "; 
     $queryText .= "WHERE b.date!=:date"; 

     $query = $em->createQuery($queryText); 
     $query->setParameter('date', $date); 
     return $query->getResult(); 

那麼,如何做我必須寫DQL查詢,以排除具有在特定日期預訂領域?

回答

0

的解決方案是做其與預定指定日期選擇所有的Fileds,然後使用該查詢中過濾掉所有字段的選擇的子查詢。

我用的QueryBuilder和劃分子查詢&查詢的清晰度,但隨時根據自己的喜好修改任何內容。

... 
$em = $this->getDoctrine()->getManager(); 

$qb = $em->createQueryBuilder(); 
$bookedFieldsQuery = $qb->select('bookedf') 
         ->from('MyBundle:Field', 'bookedf') 
         ->join('bookedf.bookings', 'b', 'WITH' ,'b.date = :date') 
         ->getDQL(); 

$qb = $em->createQueryBuilder(); 
$availableFieldsQuery = $qb->select('f') 
          ->from('MyBundle:Field', 'f') 
          ->where($qb->expr()->notIn('f', $bookedFieldsQuery)) 
          ->getQuery(); 

$availableFields->setParameter('date', $date); 

return $availableFieldsQuery->getResult(); 
... 

最終DQL本身:

SELECT f FROM MyBundle:Field f WHERE f.id NOT IN(SELECT bookedf.id FROM MyBundle:Field bookedf INNER JOIN bookedf.bookings b WITH b.date = :date) 
+0

謝謝,它的工作! – Redleafar

相關問題