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の記事を投稿しているので
見てください!

とびうお
ブログ管理人です!本人が書く記事は少なめ。。ごめんなさい))。

コメント

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