Laravel 9にてリレーション先で検索したものを取得したい

この記事ではリレーション先の中で検索して、データを取得したい場合の書き方について説明していきます。

コード

//Userに紐づいていてかつstatusが1のpostを取得する

$post = $user->post()->where('status',1)->get();

このように書くことができます。

とびうお
とびうお

リレーションに()をつけて検索すればOK!

詳しい説明

今回はUserに紐づいているPostの中でかつstatusが1のものを取得したい!というユースケースです。

この書き方をするためにはUserモデルに以下の定義がされていることが必要です。

//User.php

public function posts(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
        return $this->hasMany(Post::class);
    }
とびうお
とびうお

これでリレーションを定義します

リレーションで()をつけないで使用する

よくあるリレーションの使い方として

$post = $user->post;

が挙げられます。この時$postにはUserに紐づいたコレクションが入っています。

では、

$post = $user->post();

と書いたら、何が返ってってくるのでしょうか?

とびうお
とびうお

よくわからない…

同じものが返ってくる!

実は、

$post = $user->post;

$post = $user->post()->get();

とした時に$postの中身は全く同じなのです。

とびうお
とびうお

()をつけるとwhereみたいなことをしてくれるということなのか!

まとめ

それゆえに、初めに書いた通り

//Userに紐づいていてかつstatusが1のpostを取得する

$post = $user->post()->where('status',1)->get();

と書けるというわけです!

参考

Eloquent:リレーション 8.x Laravel
とびうお
とびうお

トビログでは他にも色々なLaravelの記事を投稿しているので是非ご覧ください!

とびうお
ブログ管理人です!
swimaneというアプリをリリースしました!

コメント

タイトルとURLをコピーしました