Как для GridView связанной таблицы сделать выборку не через '*'?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
i-programmer
Сообщения: 59
Зарегистрирован: 2015.08.24, 18:50

Как для GridView связанной таблицы сделать выборку не через '*'?

Сообщение i-programmer » 2019.03.29, 14:56

Есть GridView с пользователями.

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

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [                        
	        [
		        'attribute' => 'userType',
		        'value' => 'userType.Name',
		        'filter' => false,
	        ],
            'username',            
        ],
    ]); ?>

У пользователя есть тип (userType). Если в параметр query класса ActiveDataProvider присваивать

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

User::find()
, то выборка будет ленивой и результат запросов на странице будет:

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

SELECT COUNT(*) FROM `user`
SELECT * FROM `user` LIMIT 20
SELECT * FROM `usertypes` WHERE `UserTypeId`=1
SELECT * FROM `usertypes` WHERE `UserTypeId`=1
SELECT * FROM `usertypes` WHERE `UserTypeId`=2
Если выборку делать жадной

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

$query = User::find()->joinWith('userType'); 
, то результат будет:

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

SELECT COUNT(*) FROM `user` LEFT JOIN `usertypes` ON `user`.`UserTypeId` = `usertypes`.`UserTypeId`
SELECT `user`.* FROM `user` LEFT JOIN `usertypes` ON `user`.`UserTypeId` = `usertypes`.`UserTypeId` LIMIT 20
SELECT * FROM `usertypes` WHERE `UserTypeId` IN (1, 2)

Вопрос: могу ли я как-то повлиять на ленивую/жадную загрузку так, чтобы выборка была не через звездочку '*', а с указанными мною полями? Ибо если таблица большая, то делать выборку всех полей не совсем корректно.

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Как для GridView связанной таблицы сделать выборку не через '*'?

Сообщение Seagull » 2019.03.29, 15:59

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

User::find()->joinWith(['userType' => function(Query $q) {
	return $q->select([/* fields */]);
}]);

i-programmer
Сообщения: 59
Зарегистрирован: 2015.08.24, 18:50

Re: Как для GridView связанной таблицы сделать выборку не через '*'?

Сообщение i-programmer » 2019.03.29, 16:46

Seagull писал(а):
2019.03.29, 15:59

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

User::find()->joinWith(['userType' => function(Query $q) {
	return $q->select([/* fields */]);
}]);
Благодарю.

Закрыто