Laravel 9, как фильтровать элемент в $ с результатом?

У меня есть фрагмент кода, который фильтрует только те компании, которые имеют customerRewards отношение к какому-либо клиенту и принадлежат ему. Фильтр whereHas() работает нормально, но результат customerRewards из $with также содержит элементы с разными идентификаторами клиентов.

$companies = Company::with(['customerRewards'])  // This is the problem
    ->has('customerRewards')
    ->whereHas('customerRewards', function(Builder $q) use ($customer) {
        $q->where('customer_id', $customer->id);  // This works as expected
    })
    ->get();

Как я могу отфильтровать коллекцию $with?

🤔 А знаете ли вы, что...
В PHP есть много встроенных функций для работы с строками, массивами и файлами.


1
105
1

Ответ:

Решено

Чтобы отфильтровать коллекцию CustomerRewards, загруженную с помощью метода $with, вы можете использовать методы сбора данных Laravel, такие как filter() илиwhere(). Однако, поскольку вы применяете фильтр, а отношение eger Loaded еще не загружено, вы должны использовать методwhereHas(), а также метод (), чтобы загружать только соответствующие вознаграждения клиентов. Вот как вы можете изменить свой код:

$companies = Company::with(['customerRewards' => function($query) use ($customer) {
    $query->where('customer_id', $customer->id);
}])
->has('customerRewards')
->whereHas('customerRewards', function($query) use ($customer) {
    $query->where('customer_id', $customer->id);
})
->get();

надеюсь, это сработает для вас