laravel

Laravel8でjoin時のon句に複数条件を付ける場合の書き方を紹介【注意点あり】

団結

 

あなた
Laravel8でjoin時に、複数の条件をつけたいです。

どうしたらいいですか?

 

今回はこのような疑問に答えていきます。

 

結論:joinメソッドの引数にクロージャを渡す

 

結論から話すと、joinメソッドの引数にクロージャを渡せばOKです。

 

より高度なJOIN句を指定することもできます。そのためには、joinメソッドの2番目の引数にクロージャを渡します。クロージャはIlluminate\Database\Query\JoinClauseインスタンスを受け取ります。これにより、"join"句に制約を指定できます。

引用:公式ドキュメント

 

コード例を紹介

 

実現したいSQLが以下だとします。

 

SELECT 
    `users`.`name` AS `user_name`,
    `messages`.*
FROM
    `messages`
        INNER JOIN
    `users` ON `messages`.`user_id` = `users`.`id`
    AND   `messages`.`id` > '13'

 

この場合、laravel側のコードは次のようになります。

where()の部分で、2つ目のON句の条件を指定しています。

 

DB::table('messages')
->join('users', function ($join) {
                $join->on('messages.user_id', '=', 'users.id')
                    ->where('messages.id', '>', 13);
            })
->select('users.name as user_name', 'messages.*')->get();

 

ちなみに、on句で「or」を使いたい場合は

->orOn('messages.pro_id', '=', 'users.id');

のように書いてあげればOKです。

 

【補足】

処理実行時に、SQLを確認できるように、デバッグモードをONにしておくといいです。Laravel8.Xでデバックモードを有効&デバッグバーを表示する方法【できない場合の解決方法も記載】で方法を紹介しています。

 

デバッグモード時のSQL
こんな感じで、実行されているSQLを確認できます

【注意点】ON句の条件に、変数を使うことはできない

 

本題に戻ります。

実は、先程のjoinメソッドを使った方法では、ON句で変数を使うことができません。

コード例は以下です。

 

//これだと失敗します
DB::table('messages')
->join('users', function ($join,$num) {
        $join->on('messages.user_id', '=', 'users.id')
         ->where('messages.id', '>', $num); //ここで$numは使えません
    })
->select('users.name as user_name', 'messages.*')->get();

 

じゃあ変数を使いたい場合は、どうすればいいかですが、結論から話すとSQLを直書きするといいです。

次のように書いてみましょう。

 

DB::select('SELECT `users`.`name` AS `user_name`, `messages`.* FROM `messages` INNER JOIN `users` ON `messages`.`user_id` = `users`.`id` AND `messages`.`id` > ?' , [$num]);

 

こうすることで、変数$numもon句で使用可能になります。

 

プログラミングスクールに関する情報

【無料あり】プログラミングスクールおすすめランキング【WEBエンジニアになりたい方向け】と書かれた画像
【無料あり】プログラミングスクールおすすめランキング【WEBエンジニアになりたい方向け】

  あなたプログラミングスクールに通いたいけどたくさんありすぎてどこがいいのかわかりません。   最近はエンジニアブームということもありプログラミングスクールが増えました。 一方でたくさんありすぎてど ...

続きを見る

返金保証ありのプログラミングスクールランキング【エンジニアが選びました】と表示されたパソコンの画面
【転職保証つき】返金保証ありのプログラミングスクールランキング【エンジニアが選びました】

  あなた返金保証がついているオススメのプログラミングスクールってありますか?   結論から話すと、返金保証つきのプログラミングスクールランキングは次の通りです。   1位:DMMWEBキャンプ  【 ...

続きを見る

wordpress
【無料あり】WEB制作を学べるオンラインスクールランキング【副業で稼ぎたい方向け】

  あなたWeb制作の副業で稼ぎたいけど、どのスクールで学ぶのが良いの? スクール選びで失敗はしたくないです。   ↑このような疑問や不安を解決するべく、現役のWebエンジニアがWEB制作を学べるスク ...

続きを見る

フリーランス
無料あり:フリーランスを目指せるプログラミングスクールランキング【体験をもとに徹底分析しました】

  あなたフリーランスエンジニアを目指すことができるプログラミングスクールってありますか?   最近では、高年収や働きやすさの魅力からフリーランスエンジニアを目指す方も増えてきました。 結論から話すと ...

続きを見る

WEB系自社開発企業にいけるプログラミングスクールランキング【現役エンジニアおすすめ】と書かれた画像
WEB系自社開発企業にいけるプログラミングスクールランキング【現役エンジニアおすすめ】

  あなたWEB系の自社開発企業に就職したいです。 オススメのスクールを教えて下さい。   結論から話すと、WEB系自社開発に行きやすいスクールのランキングは以下の通り。   第1位:テックアカデミー ...

続きを見る

-laravel

© 2024 エンジニアてんし君ブログ