У меня есть следующие две коллекции:Laravel 5,1 - фильтрация по коллекции не работает
$credits = collect([
['quantity' => 3, 'product_id' => 1],
['quantity' => 2, 'product_id' => 5]
]);
$basketItems = collect([
['id' => 1, 'basket_id' => 4, 'product_id' => 1],
['id' => 2, 'basket_id' => 4, 'product_id' => 2],
['id' => 3, 'basket_id' => 4, 'product_id' => 1],
['id' => 4, 'basket_id' => 4, 'product_id' => 1],
['id' => 5, 'basket_id' => 4, 'product_id' => 1]
]);
$credits
коллекция рассказывает нам пользователь имеет 3 доступные кредиты, чтобы использовать для product_id
1.
Теперь я хочу создать две новые коллекции. Если у пользователя есть элементы корзины, для которых у них есть доступные кредиты, это можно определить с помощью product_id, затем я хочу добавить эти элементы в новую коллекцию под названием $basketItemsUseCredits
.
Если у корзинных предметов нет доступных кредитов на тип продукта, я хочу добавить их в другую коллекцию под названием $basketItemsPay
.
Итак, в приведенном выше примере мне должно быть $basketItemsUseCredits
с элементами корзины, которые имеют идентификаторы 1,3 и 4. $basketItemsPay
должны заканчиваться на basketsitems с идентификаторами 2 и 5. Следующие не работают.
$basketItemsUseCredits = $basketItems->map(function ($basketItem) use ($credits) {
$qty = $credits->where('product_id', $basketItem->product_id)->get('quantity', 0);
if ($qty > 0) {
// update quantity
$credits->transform(function ($credit) use ($basketItem) {
if ($credit->product_id == $basketItem->product_id) {
$credit->quantity = $credit->quantity - 1;
return $credit;
}
else
return $credit
});
return $basketItem;
}
})
$basketItemsPay = $basketItems->map(function ($basketItem) use ($basketItemsUseCredits) {
if (!$basketItemsUseCredits->contains('id', $basketItem->id))
return $basketItem;
});
if(!$basketItemsPay->isEmpty()) {
// do some extra stuff
}
Следующая строка всегда возвращается 0:
$qty = $credits->where('product_id', $basketItem->product_id)->get('quantity', 0);
Также еще одна вещь, я заметил. Если $basketItemsPay
пуст, например. если я dd($basketItemsPay)
я получаю следующее:
Collection {#316 ▼
#items: array:1 [▼
0 => null
]
}
Так почему же следующие всегда вычисляться верно в приведенном выше сценарии?
if(!$basketItemsPay->isEmpty()) {
// do some extra stuff
}
Любая помощь оценивается.
* UPDATE *
удалось исправить, выполнив следующие действия - если ни один не знает лучшее решение:
$qty = $credits->where('product_id', $basketItem->product_id)->first()['quantity'];
И цепочки метод отклонять следующим образом избавиться от пустых значений - знает ли кто-нибудь более элегантное решение?
$basketItemsPay = $basketItems->map(function ($basketItem) use ($basketItemsUseCredits) {
if (!$basketItemsUseCredits->contains('id', $basketItem->id))
return $basketItem;
})->reject(function ($basketItem) {
return empty($basketItem);
});
У вас есть хороший повод, чтобы не реализовать 'quantity' ключ в каждом вложенном массиве внутри' $ basketItems' массив, как вы делали с '$ credits'? Я думаю, что это упростит ситуацию. Не могли бы вы также более подробно рассказать, как это не работает? Как результат вывода этого кода и как он отличается от желаемого результата? –
@Jeffrey есть ключ количества в массиве $ basketItems, я просто не показывал его, чтобы все было просто. Следующая строка всегда возвращает 0: '$ credits-> где ('product_id', $ basketItem-> product_id) -> get ('quantity', 0);' – adam78
Хорошо, но чтобы быть понятным, каждый отдельный '$ basketItem 'не имеет ключа' количество', поэтому один и тот же идентификатор продукта потенциально происходит более одного раза. Я постараюсь ответить, может потребоваться некоторое время, хотя :) –