Laravel で値を登録する際にリストにない値を登録したい、その際に既存のリストとの重複をバリデーションしたい、ただしフォームは一つ

実現したいこと

controller で update() をしても反映がされない。

前提

Laravel 初心者です
Laravel10 で入力欄を作っています。

  1. Laravel で例えば趣味を入力する欄を select で作る
  2. リストにないものは input:text で入力する
  3. ただし text の値は select の値と重複しない
  4. これを一つの入力フォームで実現したい
  5. 最後にアクセスされた値をリストの最上段にもっていきたい( updated_at を上げる?もしくは専用のカラム(以下の例では last_use )を使う?)

これで 4. までは実現することができました。

発生している問題・エラーメッセージ

$hobby -> update();
は実行されていて選択された趣味の id を $message として返して表示していますが、実際には変更がテーブルに反映されていません。

該当のソースコード

例えば index.blade.php は

html

1<select name="hobby">2<option value="1">映画</option>3<option value="2">旅行</option>4<otpion value="3">筋トレ</option>5</select>6<input type="text" name="hobby_new">

として、hobby にない値を入力したい際に hobby_new に値を入力し submit したとします。
これを趣味用テーブル hobbies に登録し、次回以降は例えば <option value="4">ゲーム</option>と追加したいと考えています。

コントローラは以下のような感じです

PHP

1namespace App\Http\Controllers;2 3use Illuminate\Http\Request;4use App\Http\Requests\HobbyPostRequest; // バリデーション用5use Illuminate\Http\RedirectResponse;6use Illuminate\View\View;7use App\Models\Hobby;8 9class HobbyController extends Controller10{11 public function index() : View12 {13 $hobbys = hobby::all()->sortByDesc('last_use');14 return view('hobbies/index', ['hobbies' => $hobbies]);15 }16 17 public function create(hobbyPostRequest $request, hobby $hobby) : RedirectResponse18 {19 $hobby = new hobby();20 $hobby -> last_use = date("Y-m-d H:i:s");21 if($request -> hobby_new){22 $hobby -> hobby = $request -> hobby_new;23 $hobby -> save();24 $message = $hobby -> hobby .'を追加しました';25 }else{26 $hobby -> id = $request -> id;27 $hobby -> update();28 $message = $hobby -> id .'を変更しました';29 }30 return redirect('hobbies')->with('message', $message);31}

試したこと

気になったので調べてみたところ $hobby -> update(); の戻り値は TRUE になっていました。
なぜ update() しても反映されないのかわかりません。
どなたかヒントだけでもお願いいたします。

コメントを投稿

0 コメント