【Laravel8】table名とmodel名が一致しない時モデルでtable名を指定する

はい、今回テーブル名とそれに紐づくモデルの名前が一致しなくてエラーがでちゃいました。

なので解決策共有

何を伝えたい

どうすれば、model内でtable名を定義できるのか。というのを理解しましょう。

今回起こった問題点

僕が中間テーブルを作りました。その中間テーブル名がclub_user_tableだったとします。

clubテーブルとuserテーブルの中間テーブルをイメージしてください。

その時にClubUserModelを作ったときに問題が起きました。

ClubUserModelを利用してレコードを格納しようとすると、「club_users_tableは存在しません」ってなエラーがでたわけです。

そう、複数系のテーブルを呼び出そうとしていたんですね~

これをどうしたら解決できるのか!

解決方法

公式のページに掲載されていました。

テーブル名

上記の例をちょっと見て、どのデータベーステーブルがFlightモデルに対応するかをEloquentに知らせていないことにお気づきかもしれません。別の名前を明示的に指定しない限り、クラスの複数形の「スネークケース」をテーブル名として使用します。したがって、この場合、EloquentはFlightモデルがflightsテーブルにレコードを格納し、AirTrafficControllerモデルはair_traffic_controllersテーブルにレコードを格納すると想定できます。


モデルの対応するデータベーステーブルがこの規約に適合しない場合は、モデルにtableプロパティを定義してモデルのテーブル名を自分で指定できます。

https://readouble.com/laravel/8.x/ja/eloquent.html

とにかくtableプロパティを定義して、モデルのテーブル名を自分で指定する必要があるってことですね!

今回の解決方法はprotected $table = 'table名'; を使うのです!

例はこんな感じ↓

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ClubUser extends Model
{
    /**
     * モデルに関連付けるテーブル
     *
     * @var string
     */
    protected $table = 'club_user';
}Code language: HTML, XML (xml)

こんな感じでテーブルを定義します。

まとめ

モデルは非常に便利ですよね。やりたいこと大体できちゃう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA