前提
現在親テーブル(Ideal_weight)と子テーブル(User_motivation)があります。
実現したいこと
子テーブルにてフォームを使ってユーザーに入力してもらいます。
その際にideal_weightテーブルに紐付いている、ideal_weight_id をリレーションを使って登録したいと考えています。
つまりuser_idのように自動でログインしているユーザーのid(ideal_weight_id)を登録したいということです!
リレーション
Model
1class IdealWeight extends Model 2{ 3 use HasFactory; 4 protected $fillable = ['height','weight','target_weight', 'exercise_level', 'period', 'basal_metabolism', 'calories_burned', 'minus_weight', 'minus_calories', 'calories_intake', 'protein_gram_intake', 'protein_calories_intake', 'fat_gram_intake', 'fat_calories_intake', 'carbo_gram_intake', 'carbo_calories_intake', 'start_day', 'last_day', 'minus_weight_day']; 5 6 public function user() { 7 return $this->belongsTo(User::class); 8 } 9 10 public function userMotivation() { 11 return $this->hasOne(UserMotivation::class); 12 } 13} 14 15 16class UserMotivation extends Model 17{ 18 use HasFactory; 19 protected $fillable = ['training_frequency','purpose']; 20 21 public function user() { 22 return $this->belongsTo(User::class); 23 } 24 25 public function idealWeight() { 26 return $this->belongsTo(IdealWeight::class); 27 } 28} 29 30
試したこと
①userMotivationをnewして、それをもとにidへアクセスすればいけるかと思い、
下記コードで書きましたが、NULLが登録されてしまいました。
public function create() { $user_id = Auth::id(); if (userMotivation::where('user_id', $user_id)->exists()) { return redirect()->route('usermotivations.index')->with( 'message', 'ボディメイク目標は既に登録済みです' ); } return view('usermotivations.create'); }
public function store(UserMotivationRequest $request) { $validated = $request->safe()->only([ 'training_frequency', 'purpose', ]); $userMotivation = new userMotivation(); $idealWeight = new idealWeight(); // バリデーション $userMotivation->training_frequency = $validated['training_frequency']; $userMotivation->purpose = $validated['purpose']; $userMotivation->user_id = Auth::id(); $userMotivation->ideal_weight_id = $idealWeight->id; $userMotivation->save(); return redirect()->route('usermotivations.index')->with( 'message', '登録が完了しました' ); }
②storeメソッドにおいて、idを引数として、
IdealWeight::find($id)と記載してみましたが、引数が少ないとエラーを吐いてしまい、
このやり方も違うと考えました。
Too few arguments to function App\Http\Controllers\UserMotivationController::store(), 1 passed in /work/backend/vendor/laravel/framework/src/Illuminate/Routing/Controller.php on line 54 and exactly 2 expected
public function store(UserMotivationRequest $request, $id) { $validated = $request->safe()->only([ 'training_frequency', 'purpose', ]); $userMotivation = new userMotivation(); // バリデーション $userMotivation->training_frequency = $validated['training_frequency']; $userMotivation->purpose = $validated['purpose']; $userMotivation->user_id = Auth::id(); $userMotivation->ideal_weight_id = IdealWeight::find($id); $userMotivation->save(); return redirect()->route('usermotivations.index')->with( 'message', '登録が完了しました' ); }
補足情報(FW/ツールのバージョンなど)
laravel9
手詰まっておりますので、どなたかアドバイスいただけますと幸いですm(_ _)m
回答2件
あなたの回答
tips
プレビュー