2013-01-02 29 views
6

我經常遇到的場景,在這裏我想查詢一個實體與特定值:在Doctrine 2 DQL中是否有一種簡單的方法來組合IS NULL和=:value?

$query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
$query->setParameter('parent', $parent); 

通常情況下,這個值可以是NULL,但WHERE e.parent = NULL產生沒有結果,迫使我砍周圍像這樣的:

if ($parent === null) { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = IS NULL'); 
} 
else { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
    $query->setParameter('parent', $parent);  
} 

雖然我理解其背後的SQL/DQL NULL != NULL的理由,事實是,該結果是在這種情況下,真的很煩。

當參數可以爲null時,是否有更簡潔的方式來執行此查詢?

+0

我的回答不正確? – ThaDafinser

回答

0

您可以使用查詢生成器:

$em = \Zend_Registry::get('em'); 

$qb_1 = $em->createQueryBuilder(); 

$q_1 = $qb_1->select('usr') 
->from('\Entities\user', 'usr') 
->where('usr.deleted_at IS NULL') 
->orWhere('usr.status='.self::USER_STATUS_ACTIVE) 
->andWhere('usr.account_closed_on is null'); 

$q_1->getQuery()->getResult(); 
+1

我想你誤解了這個問題! – Benjamin

1

這是不可能的時刻。 (只爲幾種方式嘗試自己)。

bindValue()null僅適用於INSERT/UPDATE值綁定。

我認爲這個限制是在PDO或SQL語法本身而不是Doctrine。

可以使用QueryBuilder的,所以你只需要,而不是整個查詢到「複製」 WHERE部分,:http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-clause

編輯:有可能在本地SQL:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

可悲主義沒有那個操作員:http://doctrine1-formerly-known-as-doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#operators-and-operator-precedence

0

只是試圖解決同樣的問題,我實際上找到了PostgreSQL的解決方案。根據所給出$id它返回的特定公司或所有,如果null傳遞

$sql = 'SELECT * FROM company WHERE COALESCE(:company_id, NULL) ISNULL OR id = :company_id;' 
$connection->executeQuery($sql, ['company_id' => $id]); 

。這個問題似乎是解析器不知道你實際上將如何處理這個參數,所以通過將它傳遞給COALESCE函數它知道它將它傳遞給一個函數,所以問題就解決了。

因此,如果它開始在「純」的SQL解決方案中工作,在DQL中使用它應該不成問題。我沒有嘗試,但教義應該有COALESCE支持,所以DQL應該很容易更新。

相關問題