くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

【未解決】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とかを使おうかと思ったか言うと、

  1. ソフトデリートを使いたい!(ソフトデリートを知るまで、joinした全てのテーブルのレコードに対してwhere('is_deleted', 0)を確認していてモデルが長くなって分かりづらい上に、チェック漏れが出る!
  2. joinがいちいち面倒!
  3. 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 的な呼び方をしなければいけないらしい。

とりあえずこれで動いたのですが、なぜこうしないと動かないのかなどよくわからないので、詳しい方教えてください笑