Symfony 条令-从db中选择一个空值

Symfony 条令-从db中选择一个空值,symfony,doctrine,Symfony,Doctrine,我有一个类,比如Test.php。此类具有id、说明、代码和折扣百分比 此代码返回一个对象: $test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->findOneBy(array('code' => 12345 )); $test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->f

我有一个类,比如Test.php。此类具有id、说明、代码和折扣百分比

此代码返回一个对象:

$test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->findOneBy(array('code' => 12345 ));
$test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->findOneBy(array('code' => null ));
相反,此代码不返回对象:

$test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->findOneBy(array('code' => 12345 ));
$test = $this->getDoctrine()->getRepository('\UserBundle\Entity\Test')->findOneBy(array('code' => null ));
默认情况下,“代码”字段为空

有什么建议吗?谢谢

取自


在SQL中,使用逻辑运算符(例如=,!=,)将空值与任何其他值(包括另一个空值)进行比较,虽然Qoopmao对于第一部分是正确的,“要查询
null
值,您需要使用
是空的
,而不是
=null
”,但我不得不说第二部分“条令捷径不做的事”是不正确的(至少对于2.5.4版来说是如此,这是问题发生时最新的稳定版本)

(使用参数
array('code'=>null)
)最终调用
(使用参数
'code',null,null
),它处理null值的特殊情况(这里简称为基本值,
$columns
是一个带有单个元素的数组,例如
数组('t0.code')
$value
null
):

foreach($columns作为$column){
$placeholder='?';
...
如果(null==$value){
$selectedColumns[]=sprintf(“%s为空,$column”);
继续;
}
$selectedColumns[]=sprintf(“%s=%s”,$column,$placeholder);
}
然后执行具有正确条件的SQL查询,其形式为:

选择t0.id作为id_1,t0.description作为description_2,t0.code作为code_3。。。
从测试t0开始
其中t0.code为空
限制1
(它甚至处理数组值中的null,例如,使用参数
array('code'=>array(12345,null,42))
,它将生成以下形式的SQL条件

其中(t0.code IN(12345,NULL,42)或t0.code为NULL)
(实际上它可以从中的
中删除
NULL
,但结果是一样的。)

编辑:从2.5.0版开始,简单值和数组值都是如此(感谢提交733102B4A109C0BB8CA026B1DBADAA9BB62AE70),甚至从2.1.0版开始,简单(非数组)值也是如此(就像您的案例)(感谢提交A3290075260CDAFDD17952CA14DAA305FABCFE2)



因此,事实上,
findOneBy(数组('code'=>null))
没有返回对象只能意味着表中没有任何列
code
设置为
NULL
的行,这似乎得到了您在Qoopmao回答的注释中与Qoopmao讨论的确认,因此如果您现在使用新数据重试,它应该返回与QueryBuilder或DQL相同的对象。

Y您只需在
TestRepository
类中使用条令表达式即可

$db = $this->createQueryBuilder('t');

return $db->select('t')
    ->where($db->expr()->isNull('t.field1'))
    ->orWhere($db->expr()->isNull('t.field2'))
    ->orWhere($db->expr()->isNull('t.field3'))
    ->getQuery()
    ->getResult();

我使用queryBuilder得到了这个错误:试图在类“Doctrine\ORM\queryBuilder.Crap”上调用方法“getResult”。很抱歉。我忘记了实际生成查询的
getQuery()
。已经更新。好了,但现在我得到了这个错误:错误:对非对象调用成员函数GetOneOrnulResult()。如果我注释->GetOneOrnulResult())然后启动var_dump($test),结果是一个数组。现在一切都好了,但是当我启动带有条件的查询(其中t.code为null)时,我得到了一个空数组,即使我保存了一个code=null的对象。你100%确定它是null而不是空字符串吗?否则,我有点困惑于它没有给你正确的结果。