ユアスク by みんなシステムズ

MENU

【簡単解説】便利なLaravelのリレーションメソッド「hasManyThrough」

2023/06/22

こんにちは、小川です。今日はLaravelでよく使うリレーションメソッドの1つ、「hasManyThrough」について、とっても簡単に説明します。小学生でもわかるような説明を心がけますので、お楽しみに!

では、まず「hasManyThrough」って何か、というところから始めましょう。

想像してみてください。町にはいくつもの家があり、それぞれの家には家族が住んでいますよね。そして、それぞれの家族にはたくさんのおもちゃがあるとします。では、もしもある町のすべてのおもちゃを知りたくなったら、どうすればいいでしょう?

その時に役立つのが「hasManyThrough」なんです!このメソッドを使うと、「町」から「家」を通じて「おもちゃ」にアクセスできるんです。

つまり、コードでいうと以下のようになります。

class Town extends Model
{
    public function toys()
    {
        return $this->hasManyThrough(Toy::class, Family::class);
    }
}

これで、「町」は「家」を経由して「おもちゃ」を見つけることができます。なんとも便利な世界ですね!

それぞれの引数は次のような意味があります。

  1. Toy::class – これが最終的に取得したいもの、つまり「おもちゃ」です。
  2. Family::class – これが中間をつなげるもの、つまり「家族」です。

このように、Laravelの「hasManyThrough」を使えば、2つの関連を跨いで情報を取得することができます。それぞれの家を一つ一つ調べる手間が省け、一気に町全体のおもちゃを見つけることができるんです。

具体的な例を用いて説明します。

まずは、「hasManyThrough」を使わない場合を考えてみましょう。それぞれの「町」から「家族」を経由して「おもちゃ」を探すには、以下のように手間がかかります。

$town = Town::find(1); // まず町を探す
$toys = collect(); // おもちゃを保存するためのコレクションを作成

foreach ($town->families as $family) {
    foreach ($family->toys as $toy) {
        $toys->push($toy); // 家族ごとにおもちゃを見つけてコレクションに追加
    }
}

このように、各家族ごとにおもちゃを探し出し、それを1つずつ集めていくという手順を踏む必要があります。これは時間がかかるだけでなく、コードも複雑になります。

しかし、「hasManyThrough」を使うと、以下のように一行で町全体のおもちゃを取得できます。

$toys = Town::find(1)->toys;

これはまさに魔法のようですね!家族ごとにおもちゃを探す手間が省けて、コードもすっきりします。そして、より重要なことに、パフォーマンスも向上します。なぜなら、hasManyThroughメソッドは裏側で最適化されたクエリを作成してくれるからです。

このように、「hasManyThrough」は2つの関連を跨いで情報を取得する際に非常に便利なメソッドです。使いこなせばLaravelでの開発がさらに楽しくなるでしょう。

以上です。ありがとうございました!!