簡體   English   中英

CActiveRecord按屬性查找字段為空的地方

[英]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替換為自己的實現,否則不能將INnull值一起使用。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM