【Laravel】Base table or view not found: 1146エラーの解消法【初心者向け】

この記事は最終更新から4年以上が経過しています。情報が古くなっている可能性があります。

こんにちは、しばです。
最近仕事で使いたくてドットインストールにてLaravelを受講しました。全レッスン受講はしたんですが、まだまだレッスン通りにコマンドを打ってるだけの初心者です。

今回はローカルでログイン認証を使ったサイトを構築して、公開サーバに配信する方法を確認していたところでBase table or view not found: 1146というエラーに遭遇。

特定のテーブルが存在しない、というシンプルなエラーメッセージだけど、DBのtable名を見てもちゃんとそのテーブルは存在しているし…と非常に混乱しました。

あんまりつまづく事のないエラーなのか日本語の記事が調べても見つからなかったので、今回はこのエラーを解消した方法をまとめたいと思います。

Base table or view not found: 1146 エラー

このエラーはローカルでは発生せず、公開サーバにあげてブラウザでアクセスできるようにした後、ユーザの新規登録を試そうとした時に発生しました。

ブラウザで表示されるエラーはこんな感じ。

“SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘xxx.users’ doesn’t exist (SQL: select count(*) as aggregate from `users` where `email` = test ▶”

日本語訳)”SQLSTATE [42S02]:ベーステーブル又はビューが見つかりません:1146テーブル ‘xxx.users’は存在しません(SQL:select email(=)、ここで` email` = test▶”)

※ testはユーザ登録にメールアドレスに入力した@前の文字列

このエラーを元に調べてみると、似たような事例が見つかりました。

こちらによると以下の通り

  1. Laravel5.4から標準charasetがutf8mb4に変わった
  2. MySQL5.7.7未満ではユニーク制約を付けたカラムは最大767bytes

どちらも確認してみて、試したけど特に解消せず。

原因はテーブルの命名規則の問題

詰んだか…と思っていたところ、とある記事を発見!

テーブル名は別の名前が明示的に指定されていない限り、sが付いた名前がつけられます。(この場合’users’)
まだあまり分かっていないんですが、そうするとどうやらマイグレーションファイルの方で$tableを’user'(単数系)と指定してあげないとダメなケースがあるとのこと。
(内部的に+sで処理するからか?)

こちらは公式のドキュメント(Table Names)にも記載されています。

それでは上記URLにあった通り早速修正。
公開サーバ上でvimを使って、「2014_10_12_000000_create_users_table.php」の関数内の最初に追記します。

/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'user';

この後、Laravelのプロジェクトフォルダに移動し、$ php artisan migrate を実行
※ ちなみにxreaサーバの場合、phpは/usr/local/bin/php71cli等バージョンを明示的に記載する必要があります

ブラウザ上で確認したところ、ユーザの新規登録やログイン処理を行っても正常に動くようになりました!

Laravelを通してDBを勉強

エラーのメッセージを見ても原因が推測できないのが言語はじめたての辛さですね(ヽ´ω`)

本番サーバでの環境に合わせて色々修正しないと全く動かない。。DBは基本的にWordPressで触れるくらいしか機会がなかったので、普通のWebサイト構築とは違う難しさを感じます。ワクワクと苦悩で葛藤中(´▽`;)

まだまだ始めたてだしlaravelでどこまでのものが作れるかもわかっていないので、楽しみつつ勉強していこうと思います!