2012-02-22 11 views
2

誰かがこのDoctrineクエリを手助けできるのだろうかと思います。
基本的に、私のクエリは、外部キーが設定されていない行、またはNULLを返しません。そして、私はすべての行を返したいと思います。Doctrine DQLクエリ - 外部キーがヌルのときに行を取得する

はここ2つのスキーマです

アイテム

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

キープエラー '取得:パス式に参加で使用されるが、識別変数の実体\\種類が – ekhaled

+1

何についてbefore.'定義されていませんでした' LEFT JOIN i.type t' – webbiedave

+0

これはうまくいきました...ありがとうございました... – ekhaled

0

あなたはこのような条件をクエリに入れたくないと思うでしょう。

i.type=t.id 

あなたが行

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

もしその条件を削除したり、あなたの提案でそれを変更すると、 'Types'に4行があった場合、同じ結果を4回返します – ekhaled

2

に沿って何かを、それを削除しようとしたか、代替ありますが使用し、非常に簡単です、あなたは、それから、あなたが逆のキーを定義したエンティティでEMPTY

IS inverseKeyがEMPTYであるエンティティプリンシパルを呼び出します。

どこからaを選択するかa.typeは空です。その後

私は項目タイプのように定義されたフィールドのカリキュラムを持って

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