我有以下两个集合: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
结尾的id为1,3和4的basketitems。$basketItemsPay
应该以id为2和5的basketsitems结束。以下操作不起作用。
$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
]
}
那么,为什么下面始终为true,在上述情形?
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);
});
你有一个很好的理由不实现每个嵌套数组中的'$ basketItems'内'quantity'关键像你用'$ credits'做的阵列?我认为这会让事情变得更容易。你能否更详细地告诉我这是行不通的?像这个代码的输出是什么,它与期望的结果有什么不同? –
@Jeffrey在$ basketItems数组中有一个'quantity'键,我没有显示它来保持简单。下面这行总是返回0:'$ credits->其中('product_id',$ basketItem-> product_id) - > get('quantity',0);' – adam78
好吧,但要清楚,每个单独的'$ basketItem '没有'数量'键,这就是为什么同一个产品ID可能会多次出现的原因。我会试着想出一个答案,可能需要我一段时间:) –