[英]CActiveRecord Find By Attributes Where Field Is Null
在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
方法呢? 謝謝。
就像是:
$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'
您可以將quz
的條件作為附加參數傳遞給findAllByAttributes
:
Foo::model()->findAllByAttributes(['bar' => 'baz'], "quz IS NULL OR quz = ''")
除非將CDbCommandBuilder
替換為自己的實現,否則不能將IN
與null
值一起使用。 CActiveRecord::findAllByAttributes
調用CDbCommandBuilder::createColumnCriteria
,如果列值是一個數組,則CActiveRecord::findAllByAttributes
依次調用CDbCommandBuilder::createInCondition
。
從源代碼中,值被強制轉換為列類型,並在其后加引號,並通過implode
傳遞,導致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).')';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.