@wbright1234 do you tried $ids = collect($request->ids)->unique();?
Mar 24, 2020
3
Level 5
laravel collection prevent duplicate entries in database
Hi All I have a collection which is save in a the database, the problem is that there ids are duplicated on save, what i need is to save how do I save just on Id for each product. below is a sample code from my controller
public function storeCheck(Request $request)
{
$ids = collect($request->ids);
$quantities = collect($request->quantities);
if ($ids->count() === 0 || $quantities->count() === 0)
{
return redirect()->back()->with('error', 'Заполните чек товаром!');
}
$productsIdsToSell = Collection::make();
foreach ($ids as $index => $id)
{
$productsIdsToSell[$id] = $quantities[$index];
}
$productsIdsToSell = $productsIdsToSell->sort();
$products = Product::query()->whereIn('id', array_keys($productsIdsToSell->toArray()))->get();
foreach ($products as $index => $product) {
$actualProductQuantity = $product->batches->sum(function (Batch $batch) {
return $batch->quantity;
});
$productQuantity = floatval($productsIdsToSell[$product->id]);
//dd($productQuantity);
if ($actualProductQuantity < $productQuantity) {
return redirect()->back()->with('error', 'Количество товара на продажу указано больше, чем есть в базе');
}
foreach ($product->batches as $batch)
{
$soldProducts->push(SoldProduct::query()->make([
'product_id' => $batch->product->id,
'measure_id' => $batch->product->measure->id,
'manufacturer_id' => $batch->product->manufacturer->id,
'type' => $batch->product_type,
'purchase_price' => $batch->price * 100,
'selling_price' => $batch->product->price * 100,
'cash_desk_id' => 1,
'check_id' => $check->id,
'quantity' => $productQuantity
]));
}
$soldProducts->each(function (SoldProduct $product) {
$product->save();
});
$request->session()->flash('status', 'Товар продан успешно!');
return redirect()->back();
}
I think what I need to do is to save unique id so that there is no duplicate id
$soldProducts->each(function (SoldProduct $product) {$product->save();});
Please help
Level 53
Please or to participate in this conversation.