【未解決】LaravelのEloquentでhasManyを使おうとしたらCall to undefined method Illuminate\Database\Query\Builder::hogehoge()
タイトル通り、LaravelのEloquentでhasManyを使おうとしたらCall to undefined method Illuminate\Database\Query\Builder::hogehoge()が出てよくわからなかったけど、一応解決したので、シェア。
そもそもなぜhasManyとかを使おうかと思ったか言うと、
- ソフトデリートを使いたい!(ソフトデリートを知るまで、joinした全てのテーブルのレコードに対してwhere('is_deleted', 0)を確認していてモデルが長くなって分かりづらい上に、チェック漏れが出る!
- joinがいちいち面倒!
- Laravel使ってる感出したい!
という課題があって、それをうまく解決してくれそうなのがhasManyなどのリレーションだったのですが、なんか動かん!笑
使い方としては、普通に使っていたモデルに対して、メソッドを追加しました。
(例: 下のコードのcommentsメソッドを追加したような形)
class Post extends Eloquent {
public function comments()
{
return $this->hasMany('Comment');
}
public function getCommentCount($post_id) {
// 普通のモデルの処理
}
これで Post::commensのような使い方をすると、
Call to undefined method Illuminate\Database\Query\Builder::comments()
みたいな。(伝わりづらくてすみません。)
で、いろいろ試した結果、リレーションだけを書くファイルが必要?!らしい。
どういうことかというと
class Post extends Eloquent {
public function comments()
{
return $this->hasMany('Comment');
}
}
というEloquentをextendして、リレーションだけを書いたファイル(クラス)が必要で、
別ファイル(クラス)からPost::comments 的な呼び方をしなければいけないらしい。
とりあえずこれで動いたのですが、なぜこうしないと動かないのかなどよくわからないので、詳しい方教えてください笑