GridView сортировка по дополнительному полю

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
voron
Сообщения: 3
Зарегистрирован: 2020.01.24, 16:29

GridView сортировка по дополнительному полю

Сообщение voron »

Приветствую форумчан.
Подскажите пожалуйста по сортировке со связной таблицей.

Модели:

Код: Выделить всё

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'],
	]);
Формат поля date в таблице filter_validate - timestamp
У одного фильтра могут быть несколько проверок с разными датами.

Пытаюсь сделать сортировку по последней дате проверки, сортировка проходит не корректно.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: GridView сортировка по дополнительному полю

Сообщение leonenco »

Предоставьте SQL запрос с корректным отображением данных из БД. Это поможет сформировать првельно запрос в вашей модели поиска.
voron
Сообщения: 3
Зарегистрирован: 2020.01.24, 16:29

Re: GridView сортировка по дополнительному полю

Сообщение voron »

Запрос выглядит так

Код: Выделить всё

SELECT `filter`.* FROM `filter` 
LEFT JOIN `filter_validate` ON `filter`.`id` = `filter_validate`.`filter_id` 
ORDER BY `filter_validate`.`date` LIMIT 20
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: GridView сортировка по дополнительному полю

Сообщение yiiliveext »

'lastValidate' - нет такой связи.

Код: Выделить всё

$query->joinWith('validate');
voron
Сообщения: 3
Зарегистрирован: 2020.01.24, 16:29

Re: GridView сортировка по дополнительному полю

Сообщение voron »

Проблема была с дублированием записей в таблице filter_validate, так как один фильтр мог иметь несколько записей с проверками.
Вопрос решился группировкой

Код: Выделить всё

$query->groupBy('id');
Ответить