Жадная загрузка

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Жадная загрузка

Сообщение caHek2x »

модель Request

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

public function getUsers_link() {
   return $this->hasMany(RequestUsers::className(), ['crash_id' => 'req_id']);
}

public function getUsers() {
   return $this->hasMany(Users::className(), ['user_id' => 'user_id'])->via("users_link");
}
модель RequestUsers

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

public function getUser() {
   return $this->hasOne(Users::className(), ['user_id' => 'user_id']);
}
Делаю запрос:

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

$query = Request::find();
....
$query->with(['users_link.user']);
$query->with(['users.address.house.segment']);
return $query->all();
итог такой:
делается выборка users_link

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

SELECT * FROM `crash_req_users` WHERE `crash_id`=103
потом из выбранных users_link выбирается user

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

SELECT * FROM `isp_users` WHERE `user_id` IN (5835, 5839, 5854, 5868, 5870, 5877, 5880, 5881, 5886, 5893, 5898, 5924, 5930, 5954, 5984, 5988, 5989, 5990, 6004, 6017, 6052, 6105, 6164, 6169, 6171, 6316, 6318, 
потом зачемто опять делается

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

SELECT * FROM `crash_req_users` WHERE `crash_id`=103
я так понимаю via не берет в использование результат а просто для удобной записи чтоб viaTable не писать. .. ну да ладно это не беда ...
далее как положено делается

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

SELECT * FROM `isp_users` WHERE `user_id` IN (5835, 5839, 5854, 5868, 5870, 5877, 5880, 5881, 
далее вытаскиваются address.house.segment все как положено ...
а теперь магия:
обращаюсь я у результата к

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

foreach ($requests as $request) {
   ...$request->users_link->user->login;
}
и на удивление делается запрос

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

SELECT * FROM `isp_users` WHERE `user_id`=5868
это вроде не нормальное поведение ... похоже на баг .. или я ошибаюсь ?
а теперь еще самое забавное если поменять местами

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

$query->with(['users.address.house.segment']);
$query->with(['users_link.user']);
то все нормально
Ответить