商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

Laravelのクエリビルダの基本機能を確認する

【スポンサーリンク】

今回はPHPフレームワークの一つのLaravelの中から、データベースのクエリビルダの基本機能について確認します。今回利用するDBはMySQLです。

クエリビルダの基本

Laravelではクエリビルダが用意されており、このメソッド使用することでクエリを作成してデータベースを操作することができます。
クエリビルダを使用するにはDBファサードをuseしておく必要があります。

use DB;

まずDBファサードのtableメソッドを使用して取得したテーブル名を指定します。以下ではusersテーブルを指定してます。

$users = DB::table('users');

指定したテーブルのレコードを取得するには、getメソッドを使用します。getメソッドによりSelectされることになります。上記のクエリビルダインスタンスを使用する場合、以下のようにして取得できます。

$records = $users->get();

この場合、usersテーブルが全件取得されます。取得されたレコードは、StdClassオブジェクトのインスタンスを結果として含むCollectionオブジェクトとして返ってきます。以下では取得した結果の最初のデータのname(usersテーブルのnameカラム)を表示します。

echo $records[0]->name;

その他の基本構文

ここまでSelectを行うのに必要最低限のコードを確認しました。ここからSelectを行う際に良く使うメソッドを確認していきます。共通で以下のテーブルを使用するものとします。

$query = DB::table('table1');

取得するカラムを指定する

Selectする際に必要なカラムを指定する場合、selectメソッドやaddSelectメソッドで対応することができます。取得したいカラム名を渡すことが指定されます。両方のメソッドとも複数のカラム名を指定できます。

$query->select('col1','col2');
//ここでgetを行うと、2列取得されます

$query->addSelect('col3');
//ここでgetを行うと、3列取得されます

$query->select('col1','col2')->select('col1');
//ここでgetを行うと、1列取得されます

$query->select('col1');
$query->addSelect('col2','col3');
//ここでgetを行うと、3列取得されます

ちなみにカラム名に別名をつけたい場合は以下のようになります。

$query->select('col1','col2 as name2');
$query->addSelect('col3 as name3');

SQL文をそのまま使用する

selectメソッドでカラム名を指定して取得しましたが、関数や算出を行いたいなどSQLを直接使用したい場面もあります。そのようなときにはDB::rawメソッドを使用することで対応することができます。

$query->select(DB::raw('col1, CONCAT(col2,col3) as col23'));
//以下は上と同じとなります
$query->select('col1',DB::raw('CONCAT(col2,col3) as col23'));

DB::rawメソッドを使用して書きましたが、クエリのそれぞれに対応したrawメソッドが用意されています。
selectの部分についてはselectRawメソッドが用意されています。selectRawはaddSelect(DB::raw(...))と同じです。

$query->select(DB::raw('col1, CONCAT(col2,col3) as col23'));
//以下は上と同じとなります
$query->select('col1'));
$query->selectRaw('CONCAT(col2,col3) as col23'));
//以下も上と同じとなります
$query->select('col1'));
$query->addSelect(DB::raw('CONCAT(col2,col3) as col23'));

rawメソッドはそのままクエリとして実行されるので、SQLインジェクションが発生しないように気を付けましょう。

JOINを設定する

テーブルを結合する場合、内部結合がjoinメソッド、左外部結合がleftJoinメソッドが用意されています。テーブル名と結合条件を指定することができます。

//内部結合
$query->join('table2', 'table1.col1', '=', 'table2.col1')
    ->join('table3', 'table1.col2', '=', 'table3.col2');
//左外部結合
$query->leftJoin('table4', 'table1.col1', '=', 'table4.col1')
    ->leftJoin('table5', 'table1.col2', '=', 'table5.col3');

テーブルの結合条件が複数ある場合は、第2引数にクロージャを指定して設定することができます。

$query->join('table2', function($join){
    $join->on('table1.col1','=','table1.col1');
    $join->on('table1.col2','=','table1.col2');
});

ちなみにLaravel5.6ではサブクエリのJOINにも対応できるようになったようです。

WHEREを設定する

WHERE句についてはいくつものメソッドが用意されています。一番基本はwhereメソッドです。

$query->where('col1','=',0);
$query->where('col2','>',0);
$query->where('col3','<>',0);
$query->where('col4','like','%1');

この書き方やチェーンでつなげるとANDでのWHERE句になります。ORで対応したい場合はorWhereメソッドを使います。
この他にwhereBetween、whereIn、whereNotIn、whereNull、whereNotNull、whereRaw、orWhereRawなどがあります。

クエリビルダをどのように活用するか

クエリビルダを利用して簡単なSelectを行う方法は確認できました。SQLがわかっている人であれば、特に難しいことなく取得するコードを記述できると思います。
ただデータベースからSelectを行なおうとする度にこれらの構文を記述するのは結構面倒です。なので我々は、取得したいテーブル、結合条件、取得対象カラム、抽出条件などの定義情報を引数として渡すと、Select結果が返ってくるような関数やメソッドを定義して取得するようにしています。このあたりの設定例については、機会があれば別途紹介したいと思います。
※以下の記事で紹介しています。

Laravelのクエリビルダを構築するメソッドの検討 - Select文を作成する① - 商売力開発ブログ
Laravelのクエリビルダを構築するメソッドの検討 - Select文を作成する②複数の結合条件の対応など - 商売力開発ブログ

まとめ

今回はLaravelのデータベースのクエリビルダの基本機能のうち主にSelectの方法について確認しました。

以上
【関連するリンク】
www.prj-alpha.biz
www.prj-alpha.biz

【スポンサーリンク】