Laravel:Base table or view not found: 1146 Table ‘DataBase.staff’ doesn’t exist の罠
Base table or view not found: 1146 Table ‘DataBase.staff’ doesn’t exist の罠
エラーメッセージに正直に対応すればよかったのですが、Laravelに慣れてきたせいもありこのエラー解決に長時間を費やしてしまいました。
キーワードは【英語力】
いやぁ~、今回のこのエラーは疲れました。
Laravel 命名規制についてのおさらい
私のドはまりの理由がこの命名規制です。
Laravel では、以下のような命名規制があります。
- テーブル名は複数形を用いる
- Model名はテーブル名の単数形を使う
- コントローラー名はテーブル名の単数形+Controllerとする
具体的にUserで見てみると次のようになります。
- テーブル名:users
- Model名:User
- コントローラー名:UserController
リレーションに間違いはない?
やろうとしていた Eloquent も少し複雑なものだったのでこっちが間違えているのではと思い何回も見直しました。
書いていた Eloquent はこんなものです。
1 2 3 4 5 6 7 8 9 10 |
$contacts = Contact::whereHas('From_User',function($seach1) use($user){ $seach1->whereHas('Customer',function($seach2) use($user){ $seach2->whereHas('Staff',function($seach3) use($user){ $seach3->where('user_id',$user->id);}) ;}) ;}) ->orwhere('for_customer',$customer) ->orwhere('for_user',$user->id) ->orderBy('updated_at','desc') ->paginate(10); |
お客さんから問い合わせが来た時『担当スタッフにのみアナウンス』されるように抽出しようとしたのですがエラー。
でも下のようにModel:Customerではちゃんとリレーション設計を記載しているのです。
1 2 3 4 5 6 7 |
class Customer extends Model { public function Staff() { return $this->belongsTo('App\Models\Staff'); } } |
間違えている感じは無い。なぜ出来ない…。もう悩みまくりです。
テーブル名は複数形にする。ではStaffの複数形は?
はい、ここが私の間違いポイントでした。Staffの複数形って何でしょう。
Staffという単語は単数・複数両方あり、複数形も【staff】なのだそうです。
staffsとなることもあるけど、それは3人称単数現在の時に語尾にsがついてstaffsとなるのだとか。
でもね、動詞のstaffと言うのがイメージできないですよね。
そのほかにもstaffsとなるのは2パターンあり、まとめると以下の通り。
- 動詞staffの3人称単数現在のとき
- 集合体としてのstaffが複数ある時
- 歩行用の「杖(つえ)」や武器の「こん棒」の意味のstaffの複数形
英語のstaffは集合名詞といい、複数集まったひとまとまりを指す言葉。
なので、単数の場合は a staff 複数の場合は ten staff と表記するそうです。
動詞としては【人員を配置する】という意味を持ち、三単現のSはこの時に使われるとの事。
ただし、動詞のstaffは受動態で使うことが多いので、d が付く事が多くstaffsはあまり見かけないとの事。
テーブル名をStaffにしたら全て解決。
はい、たったこれだけでした。
英語力必要ですね。
疲れたぁ~~…。
-
前の記事
CentOS7にLaravelを構成するまでの簡易マニュアル 2020.02.29
-
次の記事
Windows7をWindows10に無償Updateする方法 2020.03.03
コメントを残す