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



我在模型中更改了以下代码:

$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);
 }

如果输入不是日期,则strtotime()返回FALSE,由于null不是日期,因此将返回FALSE

date()将时间戳转换为日期,由于php的弱类型设计,strotime()返回的FALSE被转换为0并作为0的时间戳传递给date(), 01.01.1970是UTC的开始,传递给compare()

如果value为null, CDbCriteria::compare函数将不会修改现有的搜索条件参见http://www.yiiframework.com/doc/api/1.1/CDbCriteria#compare-detail $value

文档

所以在

的情况下
$criteria->compare('ring',$this->ring,true);

compare没有修改搜索条件,因为$this->环是空的,而

$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)

相关内容

  • 没有找到相关文章

最新更新