UPDATE:
Паралельно выяснилось, что почему-то в таблицу попадает id связанной модели, а не главной. Проставил алиасы в joinWith - все равно. Пришлось добавить такое
Весь код метода поиска теперь такой:
Код: Выделить всё
public function search($params)
{
$query = Event::find()->joinWith(['tour t', 'tour.type tt']);
$today = date('Y-m-d');
$query->addSelect([
'*',
'id' => self::tableName() . '.id',
'status' => new \yii\db\Expression(
'IF (date_end < "'.$today.'", "'.self::STATUS_ENDED.'", IF(date_begin <= "'.$today.'" AND date_end >= "'.$today.'", "'.self::STATUS_IN_PROCESS.'", IF(date_begin > "'.$today.'", "'.self::STATUS_FUTURE.'", NULL)))'
)
]);
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes' => [
'id' => [
'asc' => [self::tableName() . '.id' => SORT_ASC],
'desc' => [self::tableName() . '.id' => SORT_DESC],
],
'date_begin',
'date_end',
'tour_id' => [
'asc' => ['t.name' => SORT_ASC],
'desc' => ['t.name' => SORT_DESC],
],
'tourType' => [
'asc' => ['tt.name' => SORT_ASC],
'desc' => ['tt.name' => SORT_DESC],
],
'status' => [
'asc' => ['status' => SORT_ASC],
'desc' => ['status' => SORT_DESC],
]
],
'defaultOrder' => [
'id' => SORT_DESC,
]
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
]);
if ($this->tourType) {
$query->andFilterWhere([
'tt.id' => $this->tourType,
]);
}
$query->andFilterWhere(['>=', 'date_end', $this->date_begin]);
$query->andFilterWhere(['<=', 'date_begin', $this->date_end]);
$query->andFilterWhere(['like', 't.name', $this->tour_id]);
$query->andFilterHaving([
'status' => $this->status,
]);
return $dataProvider;
}
И все равно, при попытке поиска вылезает ошибка:
Код: Выделить всё
SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'id'
The SQL being executed was: SELECT COUNT(*) FROM (SELECT *, `chr_events_events`.`id` AS `id`, IF (date_end < "2017-05-02", "ended", IF(date_begin <= "2017-05-02" AND date_end >= "2017-05-02", "in_process", IF(date_begin > "2017-05-02", "future", NULL))) AS `status` FROM `chr_events_events` LEFT JOIN `chr_events_tours` `t` ON `chr_events_events`.`tour_id` = `t`.`id` LEFT JOIN `chr_events_tours_types` `tt` ON `t`.`type_id` = `tt`.`id` HAVING `status`='ended') `c`
И где тут блин дублирование id, если указаны алиасы на приджойненные таблицы?