Странно работает жадная загрузка - eager loading

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
specterguy
Сообщения: 51
Зарегистрирован: 2013.08.06, 15:19

Странно работает жадная загрузка - eager loading

Сообщение specterguy »

Мне кажется жадная загрузка не работает в Yii2

Вот запрос

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

$user = Users::find()
            ->from(Users::tableName() . ' users')
            ->where([
                'users.email' => $email,
                'users.is_active' => Users::STATUS_ACTIVE,
                'users.is_email_confirmed' => Users::EMAIL_CONFIRMED
            ])
            ->innerJoinWith([
                'userData',
                'group' => function ($query) {
                    $query->andWhere(['group.is_active' => Groups::STATUS_ACTIVE]);
                }
            ], false)
            ->one();
 
Теперь в логах можно увидеть один запрос в двумя джойнами

Но при обращении к какому-либо полю связаной $user->userData->id или $user->group->id в логах еще запросы появляются

Зачем Yii это делает?
P.S Замена второго параметра в innerJoinWith() на true просто сразу эти все запросы делает
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Странно работает жадная загрузка - eager loading

Сообщение zelenin »

должно быть три запроса: первый выбирает данные главной таблицы, и по запросу на выборку данных каждой связи. В вашем случае 1+2 запроса.
Так работает жадная загрузка в yii2, что более прозрачно, чем в yii1, где все выбирается в одном нечитабельном запросе, с кучей алиасов, колонок, а потом все раздербанивается на разные куски.
specterguy
Сообщения: 51
Зарегистрирован: 2013.08.06, 15:19

Re: Странно работает жадная загрузка - eager loading

Сообщение specterguy »

3 запроса:
1 - табл "юзер" джоин "userData" джоин "group"
2 - выбрать с "userData", где ид юзера такое-то
3 - выбрать с "group", где ид группы такое-то

Мне кажется или джоин в первом запросе не должен позволять делать 2 следуюющих запроса?

И какой толк с innerJoinWith(), если данные связей "userData" и "group" не попадают в поля соответствующей модели?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Странно работает жадная загрузка - eager loading

Сообщение zelenin »

specterguy писал(а):
Мне кажется или джоин в первом запросе не должен позволять делать 2 следуюющих запроса?

И какой толк с innerJoinWith(), если данные связей "userData" и "group" не попадают в поля соответствующей модели?
два джойна не выбирают данных в первом запросе, но влияют на конечную выдачу, поэтому необходимы.
specterguy
Сообщения: 51
Зарегистрирован: 2013.08.06, 15:19

Re: Странно работает жадная загрузка - eager loading

Сообщение specterguy »

Возможно разработчики доделают такую фишку - если я в запросе укажу

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

->select(['users.*', 'userData.*'])
 
после этого чтобы Yii не генерил ещё один запрос при обращении к

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

$user->userData->id
Как вам такая идея?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Странно работает жадная загрузка - eager loading

Сообщение zelenin »

specterguy писал(а):Возможно разработчики доделают такую фишку - если я в запросе укажу

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

->select(['users.*', 'userData.*'])
после этого чтобы Yii не генерил ещё один запрос при обращении к

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

$user->userData->id
Как вам такая идея?
я уже написал выше об этом. так было в yii1. Для этого необходима постробработка. Это приводит к нечитаемому запросу и магии после.
сейчас все понятно и прозрачно.
Ответить