【Laravel】Eloquent ORM で $model->save(); がうまくいかなかったときの解決法
Qiita Laravel#2 Advent Calender 21日目の記事です。 furuichi と申します。Laravel 歴は大体4ヶ月です。
こういうことをやりたいとき
Eloquent の Model を使ってDBのレコードを更新( $model->save(); )したい。Model と更新用のコードは以下のような感じ。
Model.php
class Something extends Model { protected $table = 'something'; public $timestamps = false; }
ExampleController.php
public function store(Request $request) //post { $something = new Something(); $something->data = $request->data; $something->save(); }
チュートリアルによく似た方法で行なっているはずなのに、レコードが更新されなかった。save()
の戻り値もTRUEだった。
「なぜ?」と思って公式のチュートリアルを読んでみたら以下のような一文が。
解決の手がかり
https://readouble.com/laravel/5.5/ja/eloquent.html
主キー
Eloquentは更にテーブルの主キーが
id
というカラム名であると想定しています。この規約をオーバーライドする場合は、protectedのprimaryKey
プロパティを定義してください。
Something
と紐づいているテーブルの主キーを確認してみた。大文字で ID
と設定されていた。どうやら小文字のid
でないと思った通りに振舞ってくれないらしい。ということで Model のコードに主キーを以下のように追記した。
Model.php
class Something extends Model { protected $table = 'something'; // Eloquentの主キーは'id'というカラムを想定しているため、テーブル側で異なる場合は // このように指定しないといけない。 protected $primaryKey = 'ID'; public $timestamps = false; }
これで、save()
メソッドがうまく動いてくれてDBのレコードに更新をかけられるようになった。DBの主キーのカラム名には要注意です。