У меня есть фрагмент кода, который фильтрует только те компании, которые имеют 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 есть много встроенных функций для работы с строками, массивами и файлами.
Чтобы отфильтровать коллекцию 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();
надеюсь, это сработает для вас