こんにちは、小川です。今日はLaravelでよく使うリレーションメソッドの1つ、「hasManyThrough」について、とっても簡単に説明します。小学生でもわかるような説明を心がけますので、お楽しみに!
では、まず「hasManyThrough」って何か、というところから始めましょう。
想像してみてください。町にはいくつもの家があり、それぞれの家には家族が住んでいますよね。そして、それぞれの家族にはたくさんのおもちゃがあるとします。では、もしもある町のすべてのおもちゃを知りたくなったら、どうすればいいでしょう?
その時に役立つのが「hasManyThrough」なんです!このメソッドを使うと、「町」から「家」を通じて「おもちゃ」にアクセスできるんです。
つまり、コードでいうと以下のようになります。
class Town extends Model
{
public function toys()
{
return $this->hasManyThrough(Toy::class, Family::class);
}
}
これで、「町」は「家」を経由して「おもちゃ」を見つけることができます。なんとも便利な世界ですね!
それぞれの引数は次のような意味があります。
Toy::class
– これが最終的に取得したいもの、つまり「おもちゃ」です。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での開発がさらに楽しくなるでしょう。
以上です。ありがとうございました!!