2013-01-02 6 views
6

私は定期的に、私は特定の値を持つエンティティを照会するシナリオ、渡って来る:多くの場合、この値はNULLにすることができDoctrine 2 DQLにIS NULLと=を組み合わせる簡単な方法はありますか?

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

が、WHERE e.parent = NULLは次のように周りにハックするために私を強制的に、何の結果が得られていませんこれは:私はSQL/DQLでNULL != 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);  
} 

、事実はあり、その結果は、この場合には本当に迷惑です。

パラメータが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にはないと考えています。

あなただけの全体ではなく、クエリのWHEREの部分、 "複製" する必要があるので、あなたは、QueryBuilderを使用することができます。http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-clause

EDIT:それは、ネイティブ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の解決策が見つかりました。

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

nullが渡された場合、それは、特定の会社またはすべてを返し$id与えられたに基づいています。問題は、パーサが引数で実際に何をしようとしているのか分からないため、関数に渡していることを知っているので、問題を解決しました。COALESCE関数に渡します。

"純粋な" SQLソリューションで作業を開始した場合、DQL内で使用することは問題ではありません。私はそれを試していませんでしたが、DoctrineはCOALESCEをサポートする必要がありますので、DQLは簡単に更新する必要があります。

関連する問題