У меня есть CGridView, который использует столбец MAX()
mysql для предоставления данных для одного из столбцов.У меня есть такая работа с сортировкой, но я не могу понять фильтрацию.Я предполагал, что мог бы просто использовать CDbCriteria::compare()
call, чтобы установить его, но он не работает.Идеи?
Моя функция поиска:
$criteria = new CDbCriteria;
$criteria->condition = 't.is_deleted = 0 and is_admin = 0';
// get last note date
$criteria->select = array('t.*', 'MAX(n.visit_date) AS last_note');
$criteria->join = 'LEFT JOIN notes n ON t.id = n.distributor_id';
$criteria->group = 't.id';
$criteria->order = 't.status';
$criteria->compare('t.type', $this->type);
$criteria->compare('t.name', $this->name, true);
$criteria->compare('t.city', $this->city, true);
$criteria->compare('t.state', $this->state);
$criteria->compare('last_note', $this->last_note);
return new CActiveDataProvider('Distributor', array(
'criteria' => $criteria,
'pagination' => array(
'pageSize' => 20
),
'sort' => array(
'defaultOrder' => 'name',
'attributes' => array(
'last_note' => array(
'asc' => 'last_note',
'desc' => 'last_note DESC'
),
)
),
));
На мой взгляд, у меня просто установлены значения имени и значения.
Я получаю ошибку CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'last_note' in 'where clause'
Редактировать: Единственный способ, который я нашел для этого - это (потому что вы не можете иметь агрегатные функции в выражениях where), это проверить массив $_GET
для значения last_note и добавить предложение has.Обратите внимание, что это не параметризовано или что-то еще, я просто хотел сделать это, чтобы посмотреть, будет ли это работать:
if(isset($_GET['Distributor']['last_note']) && $_GET['Distributor']['last_note'] != '') {
$criteria->having = 'MAX(n.visit_date)=\'' . $this->last_note . "'";
}
Я ненавижу использовать переменные запроса в модели, как это, но этоя еще ничего не мог сделать.