2014-03-26 84 views
5

我有以下實體。Doctrine 2查詢生成器和leftJoin子查詢

實體產品:

namespace App\Model; 

use Nette\Object; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
*/ 
class Product extends Object 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    * @var int 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="SET NULL") 
    * @var int 
    */ 
    private $category; 

    /** 
    * @ORM\OneToOne(targetEntity="Image", cascade={"persist", "remove"}) 
    * @var Image 
    */ 
    private $image; 

    /** 
    * @ORM\OneToOne(targetEntity="Image", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") 
    * @var Image 
    */ 
    private $backgroundImage; 

    /** 
    * @ORM\ManyToOne(targetEntity="Layer") 
    * @ORM\JoinColumn(name="methodOfPreparing_id", referencedColumnName="id", onDelete="SET NULL") 
    * @var Layer|NULL 
    */ 
    private $methodOfPreparing; 
} 

實體層:

/** 
* @ORM\Entity 
*/ 
class Layer extends Object 
{  
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    * @var int 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="State", mappedBy="layer", indexBy="position", cascade={"persist", "remove"}) 
    * @var ArrayCollection 
    */ 
    private $states; 

    /** 
    * @ORM\Column(type="string") 
    * @var string 
    */ 
    private $name; 

    /** 
    * @ORM\Column(type="integer") 
    * @var int 
    */ 
    private $position; 
} 

實體狀態:

/** 
* @ORM\Entity 
*/ 
class State extends Object 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    * @var int 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    * @var string 
    */ 
    private $name; 

    /** 
    * @ORM\ManyToOne(targetEntity="Layer", inversedBy="states") 
    * @ORM\JoinColumn(name="layer_id", referencedColumnName="id", onDelete="CASCADE") 
    * @var Layer 
    */ 
    private $layer; 

    /** 
    * @ORM\Column(type="integer") 
    * @var int 
    */ 
    private $position; 

    /** 
    * @ORM\Column(type="integer", columnDefinition="int(1) NOT NULL") 
    * @var bool 
    */ 
    private $active; 
} 

骨架查詢:

SELECT Product 
    FROM product 
     LEFT JOIN 
      (SELECT Layer, State 
       FROM layer 
       INNER JOIN state ON layer.id = state.layer_id 
       WHERE state.active = 1 
      ) sub 
     ON sub.id = product.methodOfPreparing_id 

我需要使用查詢生成器創建DQL查詢。 這可能是左連接子查詢?

回答

3

你可以做LEFT使用WITH子句作爲連接標準JOIN子查詢DQL。

例如,

SELECT st 
FROM SomeThings st 
LEFT JOIN st.other ot WITH ot.id = (
    SELECT ot2 
    FROM OtherThings ot2 
    WHERE ot2.id = 'some ID' 
) 
WHERE blah blah blah 

......或者......

SELECT st 
FROM SomeThings st 
LEFT JOIN st.others ot WITH ot.id IN (
    SELECT ot2 
    FROM OtherThings ot2 
    WHERE ot2.status = true 
) 
WHERE blah blah blah 

...等。

下面是從代碼庫,我的工作的工作樣本:

SELECT f, df, d 
FROM Entities\Main_frames f 
LEFT JOIN f.dashboards df WITH df.dashboard IN (
    SELECT dd 
    FROM Entities\Main_dashboards dd 
    WHERE dd.dashboard_addedby = :createdBy 
    AND dd.status = true 
) 
LEFT JOIN df.dashboard d 
INDEX BY f.id 
WHERE f.createdBy = :createdBy 
    AND f.frame_type IN (2, 6) 
    AND f.status = true 
ORDER BY f.createdDate 

......還有......

SELECT m, cm, s 
FROM Entities\Main_modules m 
LEFT JOIN m.companyModules cm WITH cm.companyid = :companyId 
LEFT JOIN m.subscriptions s WITH s.id = (
    SELECT ss 
    FROM Entities\Subscriptions ss 
    WHERE ss.company = :companyId 
    AND ss.module = m.id 
    AND ss.createdDate = (
     SELECT MAX(sss.createdDate) 
     FROM Entities\Subscriptions sss 
     WHERE sss.company = :companyId 
     AND sss.module = m.id 
) 
) 
WHERE m.id <= 4 
ORDER BY m.id 
+1

雖然你不能選擇從你的例子子查詢任何東西。您只需將其用作複雜的標準。 – winkbrace

+0

我想知道你的意思是「從你的子查詢中選擇任何東西」。您可以使用這些子查詢來創建鏈接關係的子集。例如,我提供的最後一個示例僅返回模塊的最新訂閱,而不是返回該模塊的所有訂閱。 – derekm