@Nc_Soft

Many to Many Eager Loading, как сделать без join?

Имеются 3 модели Item, User, Category
class Item extends Eloquent {
    public $timestamps = false;
    protected $table = 'item';

    public function categories() {
        return $this->belongsToMany('Category', 'item_category', 'itemId', 'categoryId');
    }

    public function user() {
        return $this->belongsTo('User', 'userId')->select(['id', 'login', 'role']);
    }
}

class User extends Eloquent {
    public $timestamps = false;
    protected $table = 'user';

    public function items() {
        return $this->hasMany('Item', 'userId', 'id');
    }
}

class Category extends Eloquent {
    public $timestamps = false;
    protected $table = 'category';

    public function items() {
        return $this->belongsToMany('Item', 'item_category', 'categoryId', 'itemId');
    }
}

Воводим 5 последних Item с юзерами и категориями
$items = Item::with(['categories', 'user'])->orderBy('id', 'desc')->limit(5)->get();

Вот такие запросы генерит ларавел
select * from `item` order by `id` desc limit 5;

select `id`, `login`, `role` from `user` where `user`.`id` in (1,2,3,4,5);

select `category`.*, `item_category`.`itemId` as `pivot_itemId`, `item_category`.`categoryId` as `pivot_categoryId`
from `category` inner join `item_category` on `category`.`id` = `item_category`.`categoryId` 
where `item_category`.`itemId` in (100000, 99999, 99998, 99997, 99996);

Он достает 5 item, собирает ид юзеров, потом достает 5 юзеров, это всё нормально.
Но вот с категориями many_many непонятна логика, зачем он делает join?
Почему по аналогии не сделать запрос из item_category, а потом не достать категории по ид из таблицы category?

Или может я чего-то не знаю, и в laravel можно сделать такое поведение?
  • Вопрос задан
  • 2417 просмотров
Пригласить эксперта
Ответы на вопрос 1
Могут быть условия выборки как для pivot таблицы, так и для связанных сущностей. Чтобы всё это уложить, делается селект на pivot с ограничением по id "ближней" сущности.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы