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,但事实是,在这种情况下,结果真的很烦人。

当参数可以为空时,是否有更简洁的方法来执行此查询?

4

3 回答 3

1

目前是不可能的。(为自己尝试了几种方法)。

bindValue()withnull仅适用于 INSERT/UPDATE 值绑定。

我认为限制在于 PDO 或 SQL 语法本身,而不是 Doctrine。

您可以使用 QueryBuilder,因此您只需要“复制” WHERE 部分,而不是整个查询:http ://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-条款

编辑:在本机 SQL 中是可能的: https ://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

可悲的是教义没有那个运算符:http ://doctrine1-以前-known-as-doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#operators-and-operator-优先级

于 2015-06-08T14:41:16.483 回答
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 回答
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 回答