3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オークファングループAdvent Calendar 2019

Day 2

【Laravel】業務で頻繁に使うクエリビルダメソッド

Last updated at Posted at 2019-12-01

はじめに

オークファン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は難解でしたが、広く使われている技術ですのでこの仕事をしていくには必須だと思っています。

もしこの記事が役に立ちましたら、いいね:thumbsup:ボタンをお願いします。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?