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()
withnull
仅适用于插入/更新值绑定
我认为限制在于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
应该很容易更新。我想你误解了这个问题!我的回答不对吗?