ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.
joinのonでand…、なんかルー大柴みたいですよね。
今回はlaravelのjoinのonでandを複数設定する方法を紹介しますね。
無名関数はさむやり方でOK
いきなりやり方から。といってもこれはlaravelの公式ドキュメントに日本語で載ってるんでここまでは「知ってるよ!」って人も多いかもしれません。
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
…こういうのクロージャっていうんですね。無名関数って呼んでました。
いや使いたいのはandであってwhereじゃない!というケース
んでたぶんこの記事を読んでいる人が思ってるのは「いやぼく(わたし)がやりたいのはwhereで絞り込むんじゃなくてjoinでonするタイミングでレコードを絞り込みたいんだ!その方が速度が速いんだ!なんでwhereなんて…」っていう事だと思います。
joinするタイミングでいらないデータをonで絞り込んでからテーブル結合した方が、テーブル結合後にwhereするよりもどう考えても速いですもんね。
んでlaravelはお利口で、実はwhereを使ってもSQLクエリ上はandになってるんです。
なので上のソースコード、というかlaravel公式の通りにやっておけばちゃんと最適化された、速度の速いクエリにしてくれてるんですね。
これで安心安心。
失敗談
上記のlaravel公式ドキュメントに「orOn」っていうのがあります。
最初ぼくもwhereじゃなくてand使いたかったので「んじゃandOnってのがあるんじゃない?」で書いてみると見事エラー出ました。andOnなんてないよって。
結局、二つのテーブルの値を比較して絞り込むならorOnで複数条件を連ねていって、片方のテーブル内をある条件で絞り込むならwhereかorWhereを使ってねってことなんですね。
ちなみにSQLクエリの確認方法
そうはいっても自分で確認するまでは安心できない!実はwhere使っちゃってんじゃないの?という人もいると思います。
laravelでは簡単に実際に発行されるSQLクエリを確認できるのでご自身でチェックしてみてくださいね。
まとめ
今回はlaravelのjoinのonでandを複数設定する方法を紹介しました。
まとめるとlaravel公式通り、無名関数をはさんでやってwhereを使えばSQLクエリ上はandにしてくれるよ!という感じ。
参考にしてみてくださいね。
【おしらせ、というか完全なる宣伝】
文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.
こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /