2015-02-06 134 views
0

我有兩個實體:Doctrine2 QB - 如何選擇實體,其中OnetoOne實體不存在

class User extends BaseEntity { 

    /** 
    * @ORM\OneToOne(targetEntity="Profile", mappedBy="user", cascade={"persist", "remove"}) 
    * @var Profile 
    */ 
    protected $profile; 
} 

class Profile extends BaseEntity { 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="profile", cascade={"persist"}) 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
    * @var User 
    */ 
    protected $user; 
} 

我試圖做的是隻users沒有任何簡歷誰選擇(如此沒有profile行,user_id=:user_idprofiles表中)。但是,我不知道如何製作我的QueryBuilder。

首先,我試着像

//u as user 
$query = $this->er->createQueryBuilder('u'); 
$query 
    ->join('u.profile', 'p') 
    ->where('u.profile = 1'); 

但返回A single-valued association path expression to an inverse side is not supported in DQL queries. Use an explicit join instead.所以我想有什麼毛病我的關係簡單的東西?我試圖切換join()leftJoin()但它並沒有幫助...

那麼什麼是與此錯誤以及如何妥善狀況where()告訴我學說只希望那裏沒有配置文件的用戶?

回答

1

只是檢查null作爲profile

//u as user 
$query = $this->er->createQueryBuilder('u'); 
$query 
    ->where('u.profile is NULL'); 
+0

是啊,我發現這個論壇,但沒能檢查這個條件是因爲它一直在拋出我'Doctrine \ ORM \ Query \ QueryException:在DQL查詢中不支持單值關聯路徑表達式到反面。改用明確的連接。但我想這種情況是好的。謝謝。任何想法如何解決這個例外? – simPod 2015-02-06 15:24:53

+0

它不起作用,因爲它如上所述拋出錯誤。 – 2017-12-05 11:06:11

3

值這裏是我是如何能夠做到這一點。基本上我有域名&託管實體,我想選擇一對一的關係沒有託管附加到他們的域名。

$er->createQueryBuilder('d') 
        ->leftJoin('d.hosting', 'h') 
        ->where('h.id is NULL'); 

學分這個解決方案去這個Answer

希望它爲你工作,因爲我們的情況幾乎是相同的。

+0

這個解決方案對我有用 – Karim 2017-05-01 06:00:59

+0

該死的教條!謝謝@ noureldin275 – 2017-12-05 11:01:30

0

嘗試使用存儲庫,例如用於UserRepository

$qb = $this->createQueryBuilder('u'); 
$e = $qb->expr(); 
$qb->leftJoin('u.profile', 'p') 
    ->where($e->isNull('p.id')) 

原始查詢將是這樣的:

SELECT * FROM users AS u LEFT JOIN u.profile AS p WHERE p.id IS NULL;