はじめに
オークファンAdvent Calendar 2日目担当の長谷川爽です。
弊社に19新卒で入社して半年強が経ちました。現在は卸サイトNETSEAの開発を行なっています。
SQLはなんかすごい呪文ぐらいな認識で入社した私が、
半年間LaravelとSQLで開発をしていて覚えた、業務でよく使うクエリビルダーを初心者向けに紹介します。
いくつかの方法があるかと思いますが、DBファサードを使った方法を紹介します。
前提として、Laravel 5.5 LTS
を使用しているものとします。
準備:DBファサードのインポート
use
を使ってインポートすることで、以下のようにして呼び出せるようになります。
table
メソッドを使って、例ではuser_data
メソッドを指定しました。
アロー演算子 ->
を使うことでメソッドをつなげてクエリを作り込んでいきます。
<?php
use Illuminate\Support\Facades\DB;
class UserData
{
public function userList() :void
{
$users = DB::table('user_data');
}
}
select()
SELECT 文を追加します。
引数を複数にすることができ、配列を渡すこともできます。
文字列を持つ配列を渡すと、それぞれがSELECT文の対象になります。
// SELECT user_id FROM user_data
DB::table('user_data')->select('user_id');
// SELECT user_id, email, first_name, last_name FROM user_data
DB::table('user_data')->select(['user_id','email','first_name','last_name']);
join()
JOIN 文を追加します。
動作はINNER JOINと同じ。
// SELECT user_id FROM user_data INNER JOIN order ON user_data.user_id = order.user_id
DB::table('user_data')->select('user_id')
->join('order', 'user_data.user_id', '=', 'order.user_id');
leftJoin()
LEFT JOIN 文を追加します。
// SELECT user_id FROM user_data LEFT JOIN order ON user_data.user_id = order.user_id
DB::table('user_data')->select('user_id')
->leftJoin('order', 'user_data.user_id', '=', 'order.user_id');
where()
WHERE 文を追加します。
第2引数は比較演算子を設定。
// SELECT user_id FROM user_data INNER JOIN order ON user_data.user_id = order.user_id WHERE user_data.user_id = 123456
DB::table('user_data')->select('user_id')
->join('order', 'user_data.user_id', '=', 'order.user_id')
->where('user_data.user_id', '=', 123456);
orderBy()
ORDER BY 文を追加します。
ソートが必要なときに使います。
// SELECT user_id FROM user_data INNER JOIN order ON user_data.user_id = order.user_id ORDER BY order.date DESC
DB::table('user_data')->select('user_id')
->join('order', 'user_data.user_id', '=', 'order.user_id')
->orderBy('order.date', 'desc');
ヒアドキュメント
<<<
の後に特定の文字列を入力すると、うしろに書いたコードがそのまま文字列として扱われる機能です。
先にSQLが完成し文が長い場合など、実行するSQL文が既に決まっているときなどに便利です。
途中でPHPの変数を挟むことができます。なお、変数がそのまま入るのでインジェクションに気をつける必要があります。
$query = <<<EOT
SELECT
user_data.user_id
, order_data.order_id
FROM
user_data
INNER JOIN order_data
ON user_data.user_id = order_data.user_id
WHERE
user_data.user_id = 1234
ORDER BY
order_data.reg_date DESC
EOT;
$data = DB::select($query);
おわりに
SQLは難解でしたが、広く使われている技術ですのでこの仕事をしていくには必須だと思っています。
もしこの記事が役に立ちましたら、いいねボタンをお願いします。