Имеются 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 можно сделать такое поведение?