我在模型中更改了此代码:
$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);
}
答案 0 :(得分:1)
strtotime()
会返回FALSE
,因为null不是它将返回的日期FALSE
,
date()
将时间戳转换为日期,由于php的弱类型设计,FALSE
返回的strotime()
转换为0
并作为时间戳传递给0
上的date()
到01.01.1970
的{{1}}的{{1}}传递给compare()
如果value为null,则CDbCriteria::compare
函数不会修改现有的搜索条件
请参阅有关$ value
所以在这种情况下
$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)