Doctrine orm 在Doctrine 2 DQL中,是否有一种简单的方法来组合Is NULL和=:value?

Doctrine orm 在Doctrine 2 DQL中,是否有一种简单的方法来组合Is NULL和=:value?,doctrine-orm,dql,Doctrine Orm,Dql,我经常遇到这样一个场景,我想查询具有特定值的实体: $query=$em->createQuery('从实体e中选择e,其中e.parent=:parent'); $query->setParameter('parent',$parent); 通常,该值可以为NULL,但是其中e.parent=NULL不会产生任何结果,这迫使我像这样进行攻击: if($parent==null){ $query=$em->createQuery('从实体e中选择e,其中e.parent=为NULL'); }

我经常遇到这样一个场景,我想查询具有特定值的实体:

$query=$em->createQuery('从实体e中选择e,其中e.parent=:parent');
$query->setParameter('parent',$parent);
通常,该值可以为NULL,但是
其中e.parent=NULL
不会产生任何结果,这迫使我像这样进行攻击:

if($parent==null){
$query=$em->createQuery('从实体e中选择e,其中e.parent=为NULL');
}
否则{
$query=$em->createQuery('从实体e中选择e,其中e.parent=:parent');
$query->setParameter('parent',$parent);
}
虽然我理解
NULL!=NULL
在SQL/DQL中,事实是,在这种情况下,结果真的很烦人


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

您可以使用查询生成器:

$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();

现在不可能。(我自己试过几种方法)

bindValue()
with
null
仅适用于插入/更新值绑定

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

您可以使用QueryBuilder,因此只需“复制”WHERE部分,而不是整个查询:

编辑:可以在本机SQL中进行编辑:


可悲的是,条令没有这个操作符:

只是试图解决同样的问题,而我实际上为
PostgreSQL
找到了一个解决方案

$sql='SELECT*来自COALESCE(:company\u id,NULL)为NULL或id=:company\u id;'
$connection->executeQuery($sql,['company\u id'=>$id]);
根据给定的
$id
,如果传递
null
,则返回特定公司或全部公司。问题似乎是解析器不知道您实际要对参数做什么,所以通过将它传递到
COALESCE
函数,它知道它正在将它传递到函数中,所以问题就解决了


因此,如果它开始在“纯”SQL解决方案中工作,那么在DQL中使用它应该不是问题。我没有试过,但是条令应该有
联合
支持,所以
DQL
应该很容易更新。

我想你误解了这个问题!我的回答不对吗?