PHP
Laravel

テーブル名が自動的に複数形になる


はじめに

今回がQiita初投稿です。

現在、転職活動のためのポートフォリオ制作で、詰まった&解決したことを記録したいと思います。

わかりづらい点などあったらすいません。


取り組んでいた箇所

新規投稿フォームを作成後、Migrationでテーブルを作成しデータを保存するといった部分。

通っていたスクールの教材を参考にしてコードを書いて行き、フォームにデータを入力し、更新ボタンをクリック!

ここでエラーが!!

SQLSTATE[42S02]: Base table or view not found: 1146 Table`データベース名.テーブル名`~

調べてみるとエラーの内容は「参照しにいったテーブルがないですよ」とのこと。

※僕の場合はワインのサイトを作成しているので、

・ 「データベース名/テーブル名」→「mywine/wine」で作成していました!

しかし、ここのエラーに表示されているのは

「mywine/winesのテーブルなんてないよ〜」、、、

???

僕「なぜ wines を参照しにいってるの??」


自動的にテーブルを複数形にされる


Flightモデルにどのテーブルを使用するか、Eloquentに指定していない点に注目してください。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。

Laravel 5.4 Eloquent:利用の開始


簡単に言うと、「Laravelはテーブル名を明示的に指定していない場合、Modelのクラス名に対して複数系の名前でデータベースにテーブルを探しに行く」ということらしいです。


解決方法

なぜ複数形になるのか仕組みが理解できたので、今回は、

php artisan migrate:rollback

でwineテーブルを取り消し、新たにwinesテーブルを作る。

これだけで解決しました。


感想(おまけ)

たったこれだけのエラーに半日以上の時間がかかりました。

前述の通り、教材を参考に作成していました。

そして、その教材ではニュース投稿フォームを作成しており、テーブル名は「news」でした。

こちらは元々テーブル名が複数形なので上手くいっていたということですね!

ということもあるのですが、結局、

・どういう処理が行われているのか、どこからどこが呼び出されているかがわかっていなかった

・データベースの構造

などの理解が甘かったことですね。

解決法が書いているページを見ていても、基礎的なことが理解できていればもっと早く解決できたと思います。

基礎を理解するのは本当に大事です。