首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CActiveRecord按字段为空的属性查找

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

Stack Overflow用户
提问于 2015-09-29 10:48:48
回答 2查看 1.8K关注 0票数 1

在YII1.1.*中,如何找到属性为CActiveRecord的所有数据(通过NULL实现),类似于:

代码语言:javascript
复制
Foo::model()->findAllByAttributes(['bar' => 'baz', 'qux' => [null, '']]);

不工作,因为它生成查询:WHERE (bar = 'baz') AND (qux IN (, ''))

我想找到所有的Foo记录where

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-09-29 12:01:51

类似于:

代码语言:javascript
复制
$cityModel = Cities::model()->findAllByAttributes(array("citny_name"=>"d"), "state_id IS NULL OR state_id = ''");

执行的查询:

代码语言:javascript
复制
SELECT * FROM `cities` `t` WHERE `t`.`citny_name`=:yp0 AND
(state_id IS NULL OR state_id = ''). Bound with :yp0='d'
票数 3
EN

Stack Overflow用户

发布于 2015-09-29 12:01:06

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

代码语言:javascript
复制
Foo::model()->findAllByAttributes(['bar' => 'baz'], "quz IS NULL OR quz = ''")

除非用自己的实现替换IN,否则不能在null值中使用CDbCommandBuilderCActiveRecord::findAllByAttributes调用CDbCommandBuilder::createColumnCriteria,如果列值是数组,则调用CDbCommandBuilder::createInCondition

源代码值转换为列类型,然后引用并通过implode传递,导致null被视为php的null,而不是mysql的null

代码语言:javascript
复制
foreach($values as &$value)
{
    $value=$column->typecast($value);
    if(is_string($value))
        $value=$db->quoteValue($value);
}
...
return $prefix.$column->rawName.' IN ('.implode(', ',$values).')';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32841974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档