From e18746555300b7f9bad1afac2e8259473b3fde37 Mon Sep 17 00:00:00 2001 From: Malek Tellissi Date: Sat, 12 Sep 2026 17:00:58 +0200 Subject: [PATCH] Fix syncSizes: replace belongsToMany sync with ProductSize updateOrCreate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit belongsToMany sync() is wrong for products_sizes which is a full model with its own id and a unique shopify_variant_id. The new approach: - updateOrCreate per row (safe for repeated saves) - strips non-digits from gtin, stores null when empty (fixes 500 on unsignedBigInteger column with empty string in strict SQL mode) - only deletes local-only sizes (whereNull shopify_variant_id) that were removed — Shopify-imported sizes are never deleted here Co-Authored-By: Claude Sonnet 4.6 --- .../ProductResource/Pages/EditProduct.php | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/app/Filament/User/Resources/ProductResource/Pages/EditProduct.php b/app/Filament/User/Resources/ProductResource/Pages/EditProduct.php index 32d991b..5f48e7d 100644 --- a/app/Filament/User/Resources/ProductResource/Pages/EditProduct.php +++ b/app/Filament/User/Resources/ProductResource/Pages/EditProduct.php @@ -3,6 +3,7 @@ namespace App\Filament\User\Resources\ProductResource\Pages; use App\Filament\User\Resources\ProductResource; +use App\Models\ProductSize; use App\Models\Recipe; use Filament\Actions; use Filament\Resources\Pages\EditRecord; @@ -31,22 +32,38 @@ class EditProduct extends EditRecord protected function syncSizes(): void { - $product = $this->record; + $product = $this->record; + $incoming = collect($this->data['sizes'] ?? []); + $keepIds = []; - $sizes = collect($this->data['sizes'] ?? []) - ->mapWithKeys(function ($size) { - return [ - $size['packing_id'] => [ - 'description' => $size['description'] ?? null, - 'price' => $size['price'], - 'sku' => $size['sku'] ?? null, - 'gtin' => $size['gtin'] ?? null, - ], - ]; - }) - ->toArray(); + foreach ($incoming as $size) { + if (empty($size['packing_id'])) { + continue; + } - $product->sizes()->sync($sizes); + $gtin = preg_replace('/\D/', '', (string) ($size['gtin'] ?? '')); + + $ps = ProductSize::updateOrCreate( + [ + 'product_id' => $product->id, + 'packing_id' => (int) $size['packing_id'], + ], + [ + 'price' => $size['price'], + 'sku' => $size['sku'] ?: null, + 'gtin' => $gtin !== '' ? $gtin : null, + 'description' => $size['description'] ?? null, + ] + ); + + $keepIds[] = $ps->id; + } + + // Only delete local-only sizes (no shopify_variant_id) that were removed + ProductSize::where('product_id', $product->id) + ->whereNotIn('id', $keepIds) + ->whereNull('shopify_variant_id') + ->delete(); } protected function syncRecipe(): void