createOrUpdate($product, $data); } public function update(Product $product, array $data): Product { return $this->createOrUpdate($product, $data); } protected function createOrUpdate(Product $product, array $data): Product { $isUpdating = $product->id > 0; try { DB::beginTransaction(); $data['variables'] = json_decode($data['variables']); $product->fill($data); $product->save(); if ($isUpdating) { $product->skus()->delete(); $product->description()->delete(); } $descriptions = []; foreach ($data['descriptions'] as $locale => $description) { $description['locale'] = $locale; $description['content'] = $description['content'] ?? ''; $descriptions[] = $description; } $product->descriptions()->createMany($descriptions); $skus = []; foreach ($data['skus'] as $index => $sku) { $sku['position'] = $index; $skus[] = $sku; } $product->skus()->createMany($skus); $product->categories()->sync($data['categories'] ?? []); DB::commit(); return $product; } catch (\Exception $e) { DB::rollBack(); throw $e; } } }