laravelのjoin句内whereはonになってくれてる

製作 プログラム

最終更新日:2023/08/14

ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.

タイトル通りなんですが、laravelのクエリビルダーでJOINの中でwhereを使うとそれはONとしてSQLが発行されているので処理速度速くなってくれてるよ、っていうコト。それだけ。

もう少し詳しく

laravelのクエリビルダーでjoinを使った時にその後にlaravel説明書でいうところの「上級JOIN句」内でwhereなどが使えます。

話が少し飛びますがSQLクエリは実行順があって、ON→JOIN→whereと記述の位置に関わらずこの順番で処理されます。

なのでJOINの前に絞り込めるのがONで、JOINの後に絞り込むのがwhereとなっています。

んじゃ速さを考えたらJOINする前にレコードを少しでも絞り込めるONの方が実行速度速くなるよね、と誰もが思うと思います。そりゃそうですよね、結合前に結合するレコードが減ればそれだけ走査回数が減るわけですよね。(調べてみたところ最近はデータベースが賢くなっていてONでもwhereでもあまり関係ない、という声もありましたが…)。

んじゃlaravelの説明書で言われているwhereはどっちなの?っていうのが今回の疑問。

結局調べてみるとちゃんとONの方で絞り込んでくれているので処理速度的にグッド!という事。

toSql()で確認してみてね

laravelではクエリビルダの最後にget()とかfirst()とかしてる部分をtoSql()にすれば実際にどんなSQL文が発行されているか確認できるので、もしこの記事の内容が信じられない方は自分のプログラム上でtoSql()して、その結果をvar_dump()などして表示してみるといいかも。

私も最初、「whereか~。遅くなりそうでイヤだなー」と思い、DB::Rawなどを使って強引にon句として書こうとしてたんですが、どうにもうまくいかなくてんじゃもうwhereでいいか、でやってみると内部的にはONとなっていて、なんというか無駄に時間を使ってしまいました。

…なんかこの内容を前にどこかで書いた気がするけれど、気のせいと思う事にしよう。

【おしらせ、というか完全なる宣伝】

文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.

こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /