Страница 1 из 1

Нетиповая колонка в виджете GridView

Добавлено: 2017.04.12, 21:06
Haku
Добрый вечер.
Имеется стандартный виджет GridView, с колонкой "direction_id".

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

<?= GridView::widget([
	'dataProvider' => $dataProvider,
	'filterModel' => $searchModel,
	'columns' => [
		...
		[
			'attribute' => 'direction_id',
			'filter' => Direction::getList(),
			'format' => 'raw',
			'value' => function ($model, $key, $index, $column) {
				return $model->direction->title;
			},
		],
		...
	],
]);?>
Где "getList()" — метод, делающий выборку всех записей, сортирующий их и возвращающий в виде массива, а "$model->direction" — это relation в модели "Direction". Вроде всё хорошо, виджет работает, данные отображаются, только для каждой строки в GridView производится дополнительный запрос к БД. Соответственно, если в таблице будет 100 строк, то для них осуществится 100 дополнительных запросов, что не очень хорошо.

Сначала я поменял "$model->direction" на:

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

return ArrayHelper::getValue(Direction::getList(), $model->direction_id);
и задумался, чтобы записать массив, который возвращает "getList()" в переменную выше начала виджета, чтобы не выполнять запрос много раз. А потом указать эту переменную в "filter" и в "value" следующим образом:

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

'filter' => $directions,
'value' => function ($model, $key, $index, $column) {
	return ArrayHelper::getValue($directions, $model->direction_id);
},
но на это я получил ошибку "неопределённая переменная $directions" в пункте "value".

Собственно возник вопрос, как это правильно реализовать?
В Yii 1 я бы создал публичное свойство в контроллере, в нужном методе записал туда массив записей и вызвал бы его через $this->property. В Yii 2 тоже есть такая возможность: \Yii::$app->controller->property, но почитав форум, я увидел, что такой вариант не рекомендуют. Поэтому прошу помощи у знающих людей, как решить мою проблему. Была ещё идея создать компонент, но я подумал, что это как-то слишком мудрёно.

Теги: yii2, gridview, columns, format, raw, arrayhelper.

Re: Нетиповая колонка в виджете GridView

Добавлено: 2017.04.12, 21:52
futbolim
Всё просто. В search модели выберите записи вместе с этой связью.
В методе YourModel::search()

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

$query = YourModel::find()->with(['directions']);
Это жадная загрузка. О ней можете почитать в доке.
Я бы ещё сделал проверку на существование связи:

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

return $model->direction ? $model->direction->title : 'Связи нет';

Re: Нетиповая колонка в виджете GridView

Добавлено: 2017.04.13, 00:07
Haku
futbolim писал(а): 2017.04.12, 21:52 Всё просто. В search модели выберите записи вместе с этой связью.
В методе YourModel::search()
Большое спасибо за оперативный ответ, всё получилось!