0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel 処理速度向上の為にwhereHasをwhereInに書き換える

Last updated at Posted at 2021-11-06

はじめに

whereHasの処理が遅いと言われていますが、詳しくは下記の記事を見て下さい。
whereHasが必ず悪いというわけではなく、状況次第ではwhereHasを使っても問題ありませんが、無難にwhereInへ書き換える方法を超ざっくり解説します。
https://qiita.com/mpyw/items/0761a5e44836c9bebcd5

こちらでは結局どう書けばいいのか分からない初心者に超ざっくり説明するだけの記事です。

目次

  1. whereHasの処理
  2. whereInで同様の処理を書く
  3. 参考文献

whereHasの処理

そもそもwhereHasとはリレーション先のテーブルからwhere等で絞り込んだ状態でデータを取得したい時に使います。
例えば、id=1のユーザーの投稿(posts)から公開中だけのものを絞り込みたい時は以下のように使います。

// ユーザーid=1の人を絞り込む
$user = User::where('id', 1);

// usersテーブルのリレーション先であるpostsテーブルを指定し、クロージャの中でデータを絞り込む
$published_post = $user->whereHas('posts',function($query){
  $query->where('is_published', true);
})->get();

whereInで同様の処理を書く

上で紹介したwhereHasをwhereInに書き換えてみます。
これでwhereHasを使用した時と同じデータが取得できます。

// ユーザーid=1の人を絞り込む
$user = User::where('id', 1);

// whereInの中にリレーション先のモデルインスタンスを記述し、絞りこんでデータを取得する。
$published_post = $user->whereIn('id', Post::select('user_id')
                       ->where('is_published', true))
                       ->get();

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?