Eloquent Has By Non-dependent Subquery
OVERVIEW
Laravel の Eloquent において, has() や whereHas() を用いてリレーション先の存在で絞り込みをかけるとき,相関サブクエリを排除して高速な SQL にするためのライブラリ
概要
Laravel の Eloquent Model にはリレーションを定義でき, has() や whereHas() といったメソッドを用いて「リレーション先が存在するかどうか」という条件で絞り込みをかけることもできる。ところがこのクエリは非常に非効率で,常に相関サブクエリになってしまう大きな弱点がある。これを非相関サブクエリまたは JOIN に書き換えるためのライブラリを開発し,実際の現場において高速化に貢献した。
詳細
- https://github.com/mpyw/eloquent-has-by-non-dependent-subquery を使うと,通常 WHERE EXISTS (SELECT ...) が絶対に使われてしまう相関サブクエリを WHERE id IN (SELECT ...) な非相関サブクエリに簡単に書き換えられる。
- https://github.com/mpyw/eloquent-has-by-join を使うと,通常 WHERE EXISTS (SELECT ...) が絶対に使われてしまう相関サブクエリを JOIN を使う単一のクエリに条件付きで書き換えられる。