Загрузка Eloquent связей используя left join вместо дополнительных запросов

Если вы когда-либо пытались выполнить следующий код для загрузки данных из вашей Eloquent модели и получали ошибку: MyModel: with ('relation')→where ('relation.title', '=', $title)→orderBy ('relation.field', 'asc') То вы наверняка знаете, что Eloquent производит загрузку связанных данных отдельным запросом и ни фильтрация, ни сортировки по ним работать не будут.В таком случае вам возможно поможет моя библиотека, которая позволяет перенести загрузку BelongsTo связей из дополнительных запросов в основной запрос с left join`ами.

Как это использовать? После установки пакета необходимо добавить трэйт в описание вашей модели: class MyModel extends \Eloquent { use \SleepingOwl\WithJoin\WithJoinTrait; } И все, теперь вам доступна пара новых методов: includes ($relations) Используйте этот метод вместо Model: with (), чтобы все BelongsTo связи были сконвертированы в left join`ы (поведение загрузки связей других типов изменено не будет). StreetImage: includes ('street')→where ('street.id', '<', 10)->get () Вместо двух привычных запросов будет выполнен один (<…> в запросе — это все поля связанной таблицы): select `street`.`<…>` as `__f__street---<…>`, `street_images`.* from `street_images` left join `streets` as `street` on `street`.`id` = `street_images`.`street_id` where `street`.`id` < 10 references($relations) Этот метод позволяет комбинировать функционал Eloquent по умолчанию с функционалом моей библиотеки: MyModel::with('relation', 'relation2')->references ('relation')→… В данном случае «relation2» будет загружен дополнительным запросом, а «relation» — с использование left join.Исходный код на GitHub

© Habrahabr.ru