6

特定の値を持つエンティティをクエリしたいシナリオに定期的に遭遇します。

$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になる可能性がある場合、このクエリを実行するよりクリーンな方法はありますか?

4

3 に答える 3

0

同じ問題を解決しようとしていたところ、実際に の解決策を見つけましたPostgreSQL

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

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

したがって、「純粋な」SQL ソリューションで機能し始めた場合、DQL 内で使用しても問題はありません。私はそれを試しませんでしたが、Doctrine にはCOALESCEサポートが必要なので、DQL簡単に更新できるはずです。

于 2016-10-27T13:08:04.827 に答える
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();
于 2015-04-29T08:42:31.097 に答える