Mysql CActiveRecord按字段为空的属性查找

Mysql CActiveRecord按字段为空的属性查找,mysql,yii,yii-cactiverecord,cactiverecord,Mysql,Yii,Yii Cactiverecord,Cactiverecord,在Yii 1.1.*中,如何查找属性为空的所有数据(通过CActiveRecord实现),类似于: Foo::model()->findAllByAttributes(['bar' => 'baz', 'qux' => [null, '']]); 它不起作用,因为它产生查询:WHERE(bar='baz')和(qux IN(,'') 我想查找所有Foo记录where: “bar”字段等于“baz” 和qux字段为空或等于空字符串 我可以用findAll来做,但是如果我想使

在Yii 1.1.*中,如何查找属性为空的所有数据(通过
CActiveRecord
实现),类似于:

Foo::model()->findAllByAttributes(['bar' => 'baz', 'qux' => [null, '']]);
它不起作用,因为它产生查询:
WHERE(bar='baz')和(qux IN(,'')

我想查找所有
Foo
记录
where

  • “bar”
    字段等于
    “baz”
  • qux
    字段
    为空
    或等于空字符串

我可以用
findAll
来做,但是如果我想使用
findAllByAttributes
方法呢?谢谢。

您可以将
quz
的条件作为附加参数传递到
findAllByAttributes

Foo::model()->findAllByAttributes(['bar' => 'baz'], "quz IS NULL OR quz = ''")
除非用自己的实现替换
CDbCommandBuilder
,否则不能将
中的
null
值一起使用
CActiveRecord::findAllByAttributes
调用,如果列值是数组,则依次调用

从中,值被强制转换到列类型中,然后被引用,并通过
内爆
传递,导致
null
被视为php的
null
而不是mysql的
null

foreach($values as &$value)
{
    $value=$column->typecast($value);
    if(is_string($value))
        $value=$db->quoteValue($value);
}
...
return $prefix.$column->rawName.' IN ('.implode(', ',$values).')';

您可以将
quz
的条件作为附加参数传递到
findAllByAttributes

Foo::model()->findAllByAttributes(['bar' => 'baz'], "quz IS NULL OR quz = ''")
除非用自己的实现替换
CDbCommandBuilder
,否则不能将
中的
null
值一起使用
CActiveRecord::findAllByAttributes
调用,如果列值是数组,则依次调用

从中,值被强制转换到列类型中,然后被引用,并通过
内爆
传递,导致
null
被视为php的
null
而不是mysql的
null

foreach($values as &$value)
{
    $value=$column->typecast($value);
    if(is_string($value))
        $value=$db->quoteValue($value);
}
...
return $prefix.$column->rawName.' IN ('.implode(', ',$values).')';
比如:

$cityModel = Cities::model()->findAllByAttributes(array("citny_name"=>"d"), "state_id IS NULL OR state_id = ''");
执行的查询:

SELECT * FROM `cities` `t` WHERE `t`.`citny_name`=:yp0 AND
(state_id IS NULL OR state_id = ''). Bound with :yp0='d'
比如:

$cityModel = Cities::model()->findAllByAttributes(array("citny_name"=>"d"), "state_id IS NULL OR state_id = ''");
执行的查询:

SELECT * FROM `cities` `t` WHERE `t`.`citny_name`=:yp0 AND
(state_id IS NULL OR state_id = ''). Bound with :yp0='d'

谢谢,它很有效。你的解释很清楚。谢谢你,它起作用了。你的解释很清楚。执行的查询解释了很多事情。谢谢你,这很有效!执行的查询解释了很多事情。谢谢你,这很有效!