我正在尝试按计算出的“年龄”列进行过滤。我尝试了以下方法:
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”语句。
有人知道该怎么做吗?
答案 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()
。