Laravel7 hasOneThroughとhasManyThroughについて

例えば、メンバー(menbers)がいて、そのメンバーが記事(articles)を書いて、その記事にコメント(comments)があるような場合、以下のような構成となる。

members      articles         comments
  id ----┐     id--------┐      id
         └---- member_id └----- article_id

この時、あるメンバーの全てのコメントを取得したい場合、hasManyThrough()で取得することが出来る。

Memberモデル

public function comments()
{
    $comments = $this->hasManyThrough(Comment::class, Article::class);
    return $commnets;
}

第1パラメータ:ターゲットとなるテーブル
第2パラメータ:中間テーブル
第3パラメータ:中間テーブルの外部キー
第4パラメータ:ターゲットテーブルの外部キー
第5パラメータ:元テーブルのローカルキー
第6パラメータ:中間テーブルのローカルキー
※第3から第6パラメータは命名規則に従っていれば指定しなくて良い

hasOneThrough()も考え方は同じ。
hasManyThrough()はcollectionが返ってくるのに対し、hasOneThrough()はmodel型が返ってくる。
複数レコードが存在するのにhasOneThrough()を使っても1件取得するだけでエラーにはならない。

別にhasManyThrough()を使わなくても実装方法はいろいろあるが、中間テーブルであるarticlesについてのコーディングをせず取得できるのでシンプルな実装で良いと思う。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です