現在laravelでタイピングゲームを作っています。
2つだったテーブルを更新・追加して6テーブルに分けようと考えています。
以前はPOSTされたデータを1つのテーブルに登録すれば良かったのですが、
今度は3つのテーブルに登録する必要があります。
この時にコントローラー内の登録アクションをどういった処理にすればいいのか?が分からないのです。
drillsにデータを登録するためには紐づくcateogryのIDが決定してないといけません。
POSTされた複数の値の中からcategory_nameの部分をcategoryテーブルに登録するのはいいとして、
その後、drillsテーブルに他のテーブルと関連するidをどうやって入力すればいいのか?
problemテーブルについても主テーブルとなるdrillsのIDをどうやって取得、登録すればいいのでしょうか?
なお、drillsテーブル、categoryテーブル、problemsテーブルのidカラムはオートインクリメント&プライマリーキーです。
以下、アプリの詳細です。
・テーブル構成
before↓
・現時点のコントローラー内の登録アクション
public function store(Request $request) { $drill = new Drill; Auth::user()->drills()->save($drill->fill($request->all())); return redirect('/drills')->with('flash_message', __('Registered.')); }
・現時点の投稿フォーム
<div class="form-group row"> <label for="title" class="col-md-4 col-form-label text-md-right">{{ __('Title') }}</label> <div class="col-md-6"> <input id="title" type="text" class="form-control @error('title') is-invalid @enderror" name="title" value="{{ old('title') }}" autocomplete="title" autofocus> @error('title') <span class="invalid-feedback" role="alert"> <strong>{{ __("$message") }}</strong> </span> @enderror </div> </div> <div class="form-group row"> <label for="category_name" class="col-md-4 col-form-label text-md-right">{{ __('Category') }}</label> <div class="col-md-6"> <input id="category_name" type="text" class="form-control @error('category_name') is-invalid @enderror" name="name" value="{{ old('category_name') }}" autocomplete="category_name" autofocus> @error('category_name') <span class="invalid-feedback" role="alert"> <strong>{{ __("$message") }}</strong> </span> @enderror </div> </div> @for ($i = 1; $i <= 10; $i++) <div class="form-group row"> <label for="problem{{$i - 1}}" class="col-md-4 col-form-label text-md-right">{{ __('Problem').$i }}</label> <div class="col-md-6"> <input id="problem{{$i - 1}}" type="text" class="form-control @error('problem'.($i - 1)) is-invalid @enderror" name="problem{{$i - 1}}" value="{{ old('problem'.($i - 1)) }}" autocomplete="problem{{$i - 1}}" autofocus> @error('problem'.($i - 1)) <span class="invalid-feedback" role="alert"> <strong>{{ __("$message") }}</strong> </span> @enderror </div> </div> @endfor
public function store(Request $request) { $category = new Category; $category->name = $request->name; $category->save(); $drill = new Drill; $drill->title = $request->title; $drill->user_id = Auth::user()->id; $drill->category_id = $category->id; $drill->save(); $problem = new Problem; $problem->drill_id = $drill->id; $problem->problem0 = $request->problem0; $problem->problem1 = $request->problem1; $problem->problem2 = $request->problem2; $problem->problem3 = $request->problem3; $problem->problem4 = $request->problem4; $problem->problem5 = $request->problem5; $problem->problem6 = $request->problem6; $problem->problem7 = $request->problem7; $problem->problem8 = $request->problem8; $problem->problem9 = $request->problem9; $problem->save(); // $drill = new Drill; // Auth::user()->drills()->save($drill->fill($request->all())); return redirect('/drills')->with('flash_message', __('Registered.')); }
アドバイスを元に、上記で登録できました!
categoryをアドバイス通りに実装しなかったのは、categoryのデータを他のユーザーと共有するのを考えた場合、勝手にnameの値を変えられてしまうからです。
$guardedを使って変更不可にし、追ってアドバイスを通りの実装にしようと思います。
回答2件
あなたの回答
tips
プレビュー