laravelのModelでテーブル名は明示したほうが良さそうという話


laravelのリレーションの話

リレーションでuserに関連するuser_informationsを取得したい
リレーションを貼る

    public function user_informations()
    {
        return $this->hasOne(UserInformation::class);
    }

withメソッドを使おうと思っていたらこんなエラーがでた。

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_local.user_information' doesn't exist (SQL: select * from `user_information` where `user_information`.`user_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))

テーブルが見つからないらしい。

user_informationを探しているが目的のテーブル名はuser_informationsだ。

その目的のテーブルのもmodelがこれ↓

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserInformation extends Model
{
    use HasFactory;
}

laravelはテーブル名が指定されてない場合model名をスネークケースにして複数形にしたものをテーブル名として取得するが
どうやらまれに複数系を認識できなかったりするらしい。
(informationが普通は不可算名詞でinformationsにはならないから?)

なのでこうする

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserInformation extends Model
{
    use HasFactory;
    protected $table = 'user_informations';
}

protected $table =とすることでテーブル名を明示できる。

これでエラーは解決。

今日の教訓

たまにmodelがテーブルを認識できないことがあるのでテーブル名は明示したほうがいいのかも。