groupBy удаляет загруженные отношения? - PullRequest
0 голосов
/ 24 мая 2019

Это работает (Версия A):

$applications=  Apply::with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')->get();
dd($applications);

Вот вывод со всеми отношениями:

enter image description here

Теперь я бы хотел заказать модели Apply по последней request.updated_at Для этого я добавил (Версия B):

$application = Apply::with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')
                                ->join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')
                                ->groupBy('apply.id')
                                ->orderByRaw('max(applyRequest.updated_at) desc')
                                ->get();

Это приводит к правильному sql

"select * from `apply` inner join `applyRequest` on `applyRequest`.`apply_id` = `apply`.`id` group by `apply`.`id` order by max(applyRequest.updated_at) desc"
Модели

и Apply правильно отсортированы. Однако большинство отношений больше не загружаются:

enter image description here

Как правило, загружается только отношение user, а другие отношения newUser и requests.* не загружаются в версии B (но в версии A).

Есть идеи как это исправить?

1 Ответ

0 голосов
/ 24 мая 2019

Когда вы используете join в красноречивой модели, некоторые необычные вещи могут произойти, если в обеих таблицах одинаковые столбцы (обычно id).

Я догадываюсь, что ваша энергичная загрузкапроисходит с идентификатором таблицы applyRequest, а не с идентификатором таблицы apply, поскольку красноречивый (по любой причине) использует неверное значение идентификатора для построения модели.Это может привести к тому, что ваши активные нагрузки будут неправильными или не существуют.

Вы можете проверить это, дважды сбросив модель, один раз с объединением и один раз без объединения, а затем сравните значения.

dump(Apply::get());
dump(Apply::join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')->get());

Если значения отличаются, попробуйте следующее:

$application = Apply::select('apply.*')
                   ->with('user','newUser', 'requests.files', 'requests.mails', 'requests.rank.orgas', 'requests.mode.trainer')
                   ->join('applyRequest', 'applyRequest.apply_id', '=', 'apply.id')
                   ->groupBy('apply.id')
                   ->orderByRaw('max(applyRequest.updated_at) desc')
                   ->get();

Новая функция select будет означать, что запрос все еще будет соединять данные, но будут извлечены только ваши столбцы из таблицы применения, что предотвратитнеправильные значения вводятся в модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...