Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 09.01.2020 14:31:38

Eloquent, Relationships, Left Join

Всем привет. Никак в документации не могу найти решение по поводу внешнего объединения. Допустим есть 2 сущности, со связью ManyToMany:

Class Foo extends Model
{
  public function bars()
  {
        return $this->belongsToMany(Bar::class);
  }
}

Class Bar extends Model
{
  public function foos()
  {
        return $this->belongsToMany(Foo::class);
  }
}

Данный запрос делает внутреннее объединение:

App\Foo::find(1)->bars()->get();

Можно ли используя отношения в Eloquent сделать такого типа запрос?

SELECT * FROM foos f LEFT JOIN bar_foo bf ON bf.foo_id = f.id WHERE f.id = 1;

Не в сети

#2 09.01.2020 16:37:11

Re: Eloquent, Relationships, Left Join

Используя отношения, описанные в моделях — нет. На их основе генерятся вторичные самостоятельные запросы, а не джойны.
Но ты можешь буквально написать

Foo::select(...)
->leftJoin('foo_bar',...)
->leftJoin('bar',...)
->get()

https://laravel.com/docs/5.8/queries#joins


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 09.01.2020 17:02:01

Re: Eloquent, Relationships, Left Join

Я так понимаю, большого смысла работать с отношениями в Eloquent нет. Разве что некоторые запросы будут короче и для информативности в моделях указывать связи?

Не в сети

#4 14.01.2020 12:48:49

Re: Eloquent, Relationships, Left Join

Отношения это удобно. Не всегда нужна супер-эффективность запросов, а вот простота и понятность, удобство поддержки кода важны всегда.

Если шире смотреть, фреймворки вообще создаются для того, чтобы типовые задачи решать просто и быстро. Отношения надо рассматривать не в противовес SQL, а как важный кирпичик в здании фреймворка smile Я считаю если твои данные в БД находятся в отношениях, то описать их через has*/belongsTo* это просто must have. Чтобы было понятно.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела