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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

289閲覧

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

sanokoyuki

総合スコア14

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/09/25 06:15

実現したいこと

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 Controller 10{ 11 public function index() : View 12 { 13 $hobbys = hobby::all()->sortByDesc('last_use'); 14 return view('hobbies/index', ['hobbies' => $hobbies]); 15 } 16 17 public function create(hobbyPostRequest $request, hobby $hobby) : RedirectResponse 18 { 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() しても反映されないのかわかりません。
どなたかヒントだけでもお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Hobbyモデルに$fillableを定義してlast_useを追加してください。
そうすればupdate()で更新できるようになります。

  • App\Models\Hobby
protected $fillable = [ 'last_use', ];

投稿2023/09/25 07:08

niiyz

総合スコア131

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

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

sanokoyuki

2023/09/25 10:05 編集

niiyz 様、ご指導ありがとうございます $fillable 、勉強になります ただ、 class Hobby extends Model { use HasFactory; protected $fillable = [ 'last_use', ]; } として念のためキャッシュをクリアしましたがだめでした $fillable についてはこちらも参考にさせていただきました https://qiita.com/monji586/items/58d91891caa51b514166
sanokoyuki

2023/09/25 10:17

追加の情報です 気になったので tinker を使って操作してみました $ sail artisan tinker > $hobby = Hobby::find( 1 ); > $hobby -> last_use = date("Y-m-d H:i:s"); > $hobby -> update(); でやると更新ができてデータベースにも反映されました ということは $fillable 以外にも何か問題があるのでしょうね・・・
niiyz

2023/09/25 10:56

見直しましたが既存にアクセスするソースがおかしいですね。 ``` //$hobby = new hobby(); // $hobby -> last_use = date("Y-m-d H:i:s"); // $hobby -> id = $request -> id; // $hobby -> update(); // $fillableいらないパターン $hobby = Hobby::find(1); $hobby -> last_use = date("Y-m-d H:i:s"); $hobby ->save(); or // $fillableいるパターン $hobby = Hobby::find(1); $hobby ->update(['last_use' = date("Y-m-d H:i:s")]); ``` > public function create(hobbyPostRequest $request, hobby $hobby) ルーティングが見れてないので推測ですがメソッドインジェクションで既存のHobbyが$hobbyに展開されてくるようになっていても 常に$hobby = new hobby();で初期されています。 $hobby -> id = $request -> id;でupdate()しても裏でselect * from hobbies where id = ?とか実行されないと思います。
sanokoyuki

2023/09/25 12:39

ありがとうございます。 結果的にですが、updated_at が last_use と同じ働きをしてくれるので、last_use カラムをなくせました。 HobbyController.php のクラス内を class HobbyController extends Controller { public function index() : View { $hobbys = hobby::all()->sortByDesc('updated_at'); return view('hobbies/index', ['hobbies' => $hobbies]); } public function create(hobbyPostRequest $request, hobby $hobby) : RedirectResponse { if($request -> hobby_new){ $hobby = new hobby(); $hobby -> hobby = $request -> hobby_new; $hobby -> save(); $message = $hobby -> hobby .'を追加しました'; }else{ $hobby = Hobby::find($request -> id); $hobby -> update(); $message = $hobby -> id .'を変更しました'; } return redirect('hobbies')->with('message', $message); } とすることで正常動作することを確認できました。 本当に助かりました。ありがとうございました。
sanokoyuki

2023/09/25 13:04

すみません、嘘をついていました。 last_use をなくすと変更がないので updated_at が更新されません。 - $hobby -> update(); + $hobby -> touch(); で、updated_at が更新されました。 今回は本当に勉強になりました。 ご回答いただきました niiyz 様、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問