我有以下两个集合:
$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
ID 为 1,3 和 4$basketItemsPay
的购物篮结束。最终应该以 ID 为 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
}
任何帮助表示赞赏。
* 更新 *
通过执行以下操作设法修复 - 除非有人知道更好的解决方案:
$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);
});