Вы можете загрузить категории с продуктами в одном запросе, чтобы получить список продуктов, связанных с пользователем.Или вы можете создать фильтр области в модели категорий, чтобы получить список категорий, связанных с продуктами, которые связаны с пользователем:
Загрузить категории с () продуктами:
Отношения загрузки с нетерпением
$products = Product::with('categories')->byUser(auth()->user()->id)->get();
Это вернет коллекцию товаров, в которые уже загружены связанные категории, поэтому вы можете вызвать $ products-> first () -> Categories ()-> get () для возврата списка категорий для этого продукта.
Используйте фильтр области действия в модели категорий для перечисления только категорий:
Области запросов
public function scopeByUser(Builder $query, $user_id)
{
return $query->whereHas('products', function ($q) use($user_id) {
$q->whereHas('user', function ($q) use($user_id){
$q->where('id', $user_id);
}
});
}
Затем вы можете запустить Category :: byUser (auth () -> user () -> id) -> get ();вернуть коллекцию категорий, которые связаны с продуктами, которые связаны с данным идентификатором пользователя.
ОБНОВЛЕНИЕ: условная активная загрузка с фильтром области
Вы все еще хотите использовать пользователяэнергичная загрузка с условием загрузки всех продуктов, которые связаны с пользователем, и затем применения вышеупомянутого фильтра области действия, чтобы ограничить возвращаемые категории только теми, которые связаны с пользователем:
$user_id = auth()->user()->id;
$categories = Category::with(['products'=> function($q) use($user_id){
$q->whereHas('user',function($q) use($user_id){
$q->where('id',$user_id);
});
}])->byUser($user_id)->get()
Это вернет коллекциюкатегорий, которые связаны с продуктами, которые связаны с предоставленным идентификатором пользователя, и будут загружать продукты для категории, если эти продукты связаны с предоставленным идентификатором пользователя.