【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の主キーのカラム名には要注意です。