Завантаження 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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.