1

在 Yii 1.1.* 中,如何找到CActiveRecord属性所在的所有数据(通过实现)NULL,有点像:

Foo::model()->findAllByAttributes(['bar' => 'baz', 'qux' => [null, '']]);

不起作用,因为它会产生查询:WHERE (bar = 'baz') AND (qux IN (, ''))

我想查找所有Foo记录where

  • "bar"字段等于"baz"
  • AND qux字段IS NULL或等于空字符串

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

4

2 回答 2

3

就像是:

$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'
于 2015-09-29T12:01:51.883 回答
1

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

Foo::model()->findAllByAttributes(['bar' => 'baz'], "quz IS NULL OR quz = ''")

除非用自己的实现替换,否则不能使用INwithnull值。如果列值是数组,则调用后者依次调用。CDbCommandBuilderCActiveRecord::findAllByAttributesCDbCommandBuilder::createColumnCriteriaCDbCommandBuilder::createInCondition

源代码中的值被转换为列类型并在之后引用并通过implode导致null被视为 phpnull而不是 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).')';
于 2015-09-29T12:01:06.930 回答