質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

649閲覧

リレーション関係にある親モデルのidを子モデルにて登録したい

yastinbieber

総合スコア49

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/12/20 08:20

編集2022/12/20 08:32

前提

現在親テーブル(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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2022/12/20 08:23

$user_id = Auth::id(); が NULL っていうことなんでしょうか?
yastinbieber

2022/12/20 08:31

わかりづらくてすみません! $user_idの方は正しく動いておりますので、user_idカラムに正しく登録がされております。 ideal_weight_idというideal_weightモデルに紐付いたidが登録できずで困っている次第です。
guest

回答2

0

User -> Ideal_weight -> User_motivation で一対一なら使うのはhasOneThrough
https://laravel.com/docs/9.x/eloquent-relationships#has-one-through

User.php。Userから直接UserMotivationまで飛べる。UserMotivationのuser_idは不要。

php

1 public function userMotivation() 2 { 3 return $this->hasOneThrough(UserMotivation::class, Ideal_weight::class); 4 }

userMotivation::where('user_id', $user_id)でuserMotivationから$user_idを探してる発想が逆。主語はUser。

php

1public function store(UserMotivationRequest $request) 2{ 3 $userMotivation = $request->user() 4 ->userMotivation() 5 ->create($request->only([ 6 'training_frequency', 7 'purpose', 8 ])); 9 10 return redirect()->route('usermotivations.index')->with( 11 'message', '登録が完了しました' 12 ); 13}

$request->user()は現在の認証済みユーザーなのでuser_idは自動で決まる。一対一なのでideal_weight_idも自動で決まる。自動で決まるidはLaravelが設定するので自分でしなくていい。

投稿2022/12/20 09:16

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

where で該当idを探して来られないでしょうか

php

1$userMotivation->ideal_weight_id = IdealWeight::where('user_id', '=', Auth::id())->first()->id;

投稿2022/12/20 08:42

yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yastinbieber

2022/12/20 08:48

ありがとうございます…!! 無事希望の動きになりました。 whereで探してくればよかったのですね。大変勉強になりましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問