Tobilog-Selection
この記事ではリレーション先の中で検索して、データを取得したい場合の書き方について説明していきます。
コード
//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();
と書けるというわけです!
参考
8.x Eloquent:リレーション Laravel
とびうお
トビログでは他にも色々なLaravelの記事を投稿しているので是非ご覧ください!
コメント