Подскажите пожалуйста по сортировке со связной таблицей.
Модели:
Код: Выделить всё
class Filter extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'filter';
}
public function rules()
{
return [
[['model'], 'required'],
[['model'], 'string', 'max' => 255],
];
}
public function getValidate()
{
return $this->hasMany(FilterValidate::className(), ['filter_id' => 'id']);
}
}
class FilterValidate extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'filter_validate';
}
public function rules()
{
return [
[['filter_id', 'date'], 'required'],
[['filter_id'], 'integer'],
[['date'], 'safe'],
];
}
public function getFilter()
{
return $this->hasOne(Filter::className(), ['id' => 'filter_id']);
}
}
Код: Выделить всё
class FilterSearch extends Filter
{
public $lastValidate;
public function rules()
{
return [
[['id'], 'integer'],
[['model', 'lastValidate'], 'safe'],
];
}
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
public function search($params)
{
$query = Filter::find();
$query->joinWith(['lastValidate']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['defaultOrder' => ['id' => SORT_DESC]]
]);
$dataProvider->sort->attributes['lastValidate'] = [
'asc' => ['filter_validate.date' => SORT_ASC],
'desc' => ['filter_validate.date' => SORT_DESC],
];
$this->load($params);
$query->andFilterWhere([
'id' => $this->id,
]);
$query->andFilterWhere(['like', 'model', $this->model]);
return $dataProvider;
}
}
Код: Выделить всё
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'layout' => "{items}\n{summary}\n{pager}",
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'model',
[
'label' => 'Последняя проверка',
'attribute' => 'lastValidate',
'format' => 'date',
'value' => 'lastValidate.date',
],
['class' => 'yii\grid\ActionColumn'],
]);
У одного фильтра могут быть несколько проверок с разными датами.
Пытаюсь сделать сортировку по последней дате проверки, сортировка проходит не корректно.