2012-02-22 105 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;