Добавлю еще пару “скрытых” механик:
Как и когда применять with()
, а когда whereHas()
Иногда необходимо вытащить коллекцию записей, у которых есть BelongsToMany связь с другой моделью, и забрать записи только по необходимому условию. На помощь приходит метод with()
.
Представим такую ситуацию: У нас есть Посты, со связью МногиеКоМногим
с Категориями. У каждого поста есть связь с категориями 1,2,3,4,5.
Мы хотим забрать посты у которых есть категория 1, и к каждому посту приложить эту категорию в обьект categories
. Здесь можно использовать whereHas()
, но он не передает в коллекции обьект categories
. Если после фильтра whereHas()
вставить with('categories')
в обьект вставятся ВСЕ связанные категории.
Так-что шаманим такую конструкцию:
Post::with(['categories' => function($query){
$query->where('id', 1);
}])->get();
После выполнения этого запроса, мы получим следующее:
- Список всех постов, у которых есть связь с категорией 1
- У каждого поста будет обьект
categories
внутри которой будет лежать эта одна категория
Для сравнения, давайте посмотрим на пример whereHas()
Post::whereHas('categories', function($query){
$query->where('id', 1);
})->get();
После выполнения этого запроса, мы получим следующее:
- Список всех постов, у которых есть связь с категорией 1
Если мы, в коде попробуем обратиться к $post->categories
то нам будет доступна вся коллекция категорий, когда нам будет нужна только одна.