DavP2021's avatar

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

0 likes
3 replies
DavP2021's avatar

@sti3bas Hi thanks, I tried there is still duplicate, to clarify, the ids are from form details for products added to cart for sales, am saving in table for sold products. I am getting the duplicates cos a product can have more than one batch, these duplicates are from products with more than one batch, what I have noticed from the database is that if a product have 5 batches for example, the product is saved 5 time

DavP2021's avatar

I have resolved it using unique method. Thanks Here is how I got it done


$soldProducts->unique('product_id')->each(function (SoldProduct $product) {$product->save();
});

hope this helps someone

Please or to participate in this conversation.