为什么Yii CDbcriteria在任何操作之前过滤结果?

时间:2014-05-18 02:20:08

标签: php activerecord strtotime yii

我在模型中更改了此代码:

$criteria->compare('ring',$this->ring,true);

到此:

$criteria->compare('ring',date('Y-m-d', strtotime($this->ring)),true);

然后我加载带有空过滤器的管理页面我只看到一条记录,并且只有在“' ring”#该记录是01.01.1970

我理解这是因为strtotime($this->ring)返回零。但是为什么它在字段为空时发送,以及为什么它之前没有发生。

它起作用,但看起来不是很好的

if ($this->ring!=0){
 $criteria->compare('ring',date('Y-m-d', strtotime($this->ring)),true);
 }

1 个答案:

答案 0 :(得分:1)

如果输入不是日期,则

strtotime()会返回FALSE,因为null不是它将返回的日期FALSE

date()将时间戳转换为日期,由于php的弱类型设计,FALSE返回的strotime()转换为0并作为时间戳传递给0上的date()01.01.1970的{​​{1}}的{​​{1}}传递给compare()

如果value为null,则CDbCriteria::compare函数不会修改现有的搜索条件 请参阅有关$ value

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#compare-detail文档

所以在这种情况下

$criteria->compare('ring',$this->ring,true);

compare未修改搜索条件,因为$ this-> ring为null而

$criteria->compare('ring',date('Y-m-d', strtotime($this->ring)),true);
传递给compare的值为01.01.1970

时,

将修改搜索条件

您也可以在模型中使用虚拟属性来避免搜索中的条件逻辑

public function getFormatedRing(){
  if(isset($this->ring))
    return date('Y-m-d', strtotime($this->ring));
  else
    return null
}

并使用

 $criteria->compare('ring',$this->formatedRing,true)