Запрос многоуровневого в Laravel - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть категория / Продукты / Пользователи, мне нужно получить все категории всех продуктов для конкретного пользователя.Мне удалось выбрать продукт для конкретного пользователя, но я не мог сказать, как получить все категории этих продуктов.

Продукты и отношения с пользователями - ManyToMany.Связь между продуктом принадлежит к категории и категории имеет много продуктов

Вот что я сделал:

$products = Product::byUser(auth()->id())->get();

public function scopeByUser(Builder $query)
{
    return $query->whereHas('users', function ($q) {
        $q->where('id', auth()->id());
    });
}

Но я не смог сделать это таким образом, чтобы:

$products = Category::productsByUser(auth()->id());

Чтобы я мог получить все категории и все продукты пользователя, вошедшего в систему.

Спасибо,

1 Ответ

0 голосов
/ 18 декабря 2018

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

Загрузить категории с () продуктами:

Отношения загрузки с нетерпением

$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()

Это вернет коллекциюкатегорий, которые связаны с продуктами, которые связаны с предоставленным идентификатором пользователя, и будут загружать продукты для категории, если эти продукты связаны с предоставленным идентификатором пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...