where('order_id', $orderId) ->get(); return $products; } public function reviewProduct($data, $orderId) { $tenantId = config('app.current_tenant_id'); DB::transaction(function () use ($data, $orderId, $tenantId) { foreach ($data as $item) { ProductReview::create([ 'uuid' => (string) Str::uuid7(), 'tenant_id' => $tenantId, 'customer_id' => $item['customer_id'], 'product_variant_id' => $item['product_variant_id'], 'rating' => $item['rating'], 'comment' => $item['comment'] ]); $productVariant = ProductVariant::lockForUpdate() ->where('uuid', $item['product_variant_id']) ->first(); if ($productVariant) { $newTotalRatingCount = $productVariant->total_rating + 1; $sumRating = ProductReview::where('product_variant_id', $item['product_variant_id']) ->sum('rating'); $newAverage = $sumRating / $newTotalRatingCount; $productVariant->update([ 'total_rating' => $newTotalRatingCount, 'average_rating' => $newAverage ]); } } Order::where('uuid', $orderId)->update([ 'has_been_assessed' => true ]); }); } }