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

в 11:45, , рубрики: eloquent, laravel

Если вы когда-либо пытались выполнить следующий код для загрузки данных из вашей Eloquent модели и получали ошибку:

MyModel::with('relation')->where('relation.title', '=', $title)->orderBy('relation.field', 'asc')

То вы наверняка знаете, что Eloquent производит загрузку связанных данных отдельным запросом и ни фильтрация, ни сортировки по ним работать не будут.

В таком случае вам возможно поможет моя библиотека, которая позволяет перенести загрузку BelongsTo связей из дополнительных запросов в основной запрос с left join`ами.

Как это использовать?

После установки пакета необходимо добавить трэйт в описание вашей модели:

class MyModel extends Eloquent
{
	use SleepingOwlWithJoinWithJoinTrait;
}

И все, теперь вам доступна пара новых методов:

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

Автор: sleeping-owl

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js