2012-02-22 35 views
2

我想知道是否有人可以幫助這個Doctrine查詢。
基本上,我的查詢不會返回外鍵未設置的行或NULL。我想返回所有行。學說DQL查詢 - 當外鍵爲空時獲取行

這裏有兩個模式

項目

class Items{ 
    /** 
    * @var integer $id 
    * 
    * @Column(name="id", type="integer", nullable=false) 
    * @Id 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @var string $name 
    * 
    * @Column(name="name", type="string", length=255, nullable=false) 
    */ 
    private $name; 
    /** 
    * @var integer $type 
    * 
    * @ManyToOne(targetEntity="Types") 
    * 
    */ 
    private $type; 
} 

類型

class Types{ 
    /** 
    * @var integer $id 
    * 
    * @Column(name="id", type="integer", nullable=false) 
    * @Id 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @var string $name 
    * 
    * @Column(name="name", type="string", length=255, nullable=false) 
    */ 
    private $name; 
} 

而下面的DQL查詢

SELECT i.id, i.name, t.name as type FROM entity\Items i, entity\Types t WHERE i.type=t.id (OTHER CONDITIONS...) 

上述查詢不會返回type外鍵中沒有值的行。

是否有可能返回這些行?

預先感謝您...

回答

6

嘗試LEFT JOIN:

SELECT i.id, i.name, t.name as type FROM entity\Items i LEFT JOIN i.type t 

,將返回左邊(項目)的一切,無論是否有匹配的類型。

+0

的愈來愈'錯誤:用於聯接路徑的表達,但鑑定可變實體\\類型不before.' – ekhaled 2012-02-22 17:33:36

+1

什麼定義' LEFT JOIN i.type t' – webbiedave 2012-02-22 17:39:02

+0

工作正常...非常感謝... – ekhaled 2012-02-22 17:50:00

0

聽起來像你不希望這種情況在查詢中;

i.type=t.id 

你試過沿線

(i.type=t.id OR i.type IS NULL) 
+0

如果我刪除了這個條件或者改變了你的建議,如果我在'Types'中有4行,它會返回4次相同的結果 – ekhaled 2012-02-22 17:38:30

2

很簡單取出或替代的東西,你用空

在你的實體已經定義了一個反鍵,然後,你調用您的實體主體,其中inverseKey IS EMPTY。

SELECT a FROM items a WHERE a.types IS EMPTY;

然後,我有一個字段課程中的項目的定義如下類型

/** 
* inversed key on principal entity (item) 
* @ORM\OneToMany(targetEntity="entity\types", mappedBy="id") 
*/ 
private $types;