Yii2-使用计算字段时ActiveDataProvider“计数”错误

时间:2018-09-01 16:06:48

标签: yii2

我正在尝试按计算出的“年龄”列进行过滤。我尝试了以下方法:

public $age;

public function search($params)
{
    $query = Profile::find();
    $query->select = ['*', 'age' => 'TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())'];

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }

    $query->andFilterWhere([
        'id' => $this->id,
    ]);

    $query->andFilterWhere([
        'between', 'age', $this->age_min, $this->age_max,
    ]);

    return $dataProvider;
}

但是我遇到以下错误:

  

SQLSTATE [42S22]:找不到列:1054'where'中的未知列'age'   子句'正在执行的SQL是:SELECT COUNT(*)FROM profile   age在“ 41”和“ 62”之间

因此,我认为发生了什么事,它正在尝试检索匹配记录的数量(用于ListView小部件),但是它并没有考虑到我的自定义“ select”语句。

有人知道该怎么做吗?

2 个答案:

答案 0 :(得分:3)

实际上,您应该使用:

$query->andFilterWhere([
    'between', 
    new Expression('TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())'), 
    $this->age_min, 
    $this->age_max,
]);

这里没有理由使用HAVING,如果在没有GROUP BY子句的查询中使用它,可能会造成问题。

答案 1 :(得分:1)

我找到了答案。如果要查询计算列,我需要使用andFilterHaving()而不是andFilterWhere()