解決したいこと
productsテーブルを親とするfoosテーブルが存在します。
productは複数のfooを持つことができ、productに紐づくnameを変更したい場合、
紐付いたnameのレコードをすべて削除したあとに新規に追加する以外に方法はありますか?
store, updateともに、複数のnameがリクエストされる仕様とします。
テーブル定義
php
1 public function up() 2 { 3 Schema::create('products', function (Blueprint $table) { 4 $table->id(); 5 $table->string('name'); 6 $table->timestamps(); 7 }); 8 } 9 10 public function up() 11 { 12 Schema::create('product_foos', function (Blueprint $table) { 13 $table->foreignId('product_id')->index(); 14 $table->foreign('product_id') 15 ->references('id') 16 ->on('products') 17 ->onDelete('cascade'); 18 19 $table->string('name'); 20 }); 21 }
ソースコード
php
1class Product extends Model 2{ 3 protected $fillable = ['name', 'updated_at']; 4 5 public function foos(): HasMany 6 { 7 return $this->hasMany(Foo::class); 8 } 9 10 public function createProduct(array $attributes): Product 11 { 12 $product = parent::create($attributes); 13 14 foreach ($attributes['name'] as $name) { 15 $product->foos()->create(['name' => $name]); 16 } 17 18 return $product; 19 } 20 21 public function updateProduct(array $attributes): Product 22 { 23 // $product->foosを全部消してから、再度createする必要がある? 24 25 return $this->createProduct($attributes); 26 } 27} 28 29class Foo extends Model 30{ 31 protected $fillable = ['product_id', 'name']; 32 33 public function product(): BelongsTo 34 { 35 return $this->belongsTo(Product::class); 36 } 37}
php
1class ProductController extends Controller 2{ 3 public function store(StoreRequest $request, Product $product) 4 { 5 $product->createProduct($request->input()); 6 7 return redirect()->route('product.index'); 8 } 9 10 public function update(StoreRequest $request, Product $product) 11 { 12 $product->updateProduct($request->input()); 13 14 return redirect()->route('product.index'); 15 } 16}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。