Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

Laravelのクエリビルダ基礎(SELECT編)

はじめに

Laravelでクエリビルダを使ったクエリを実行するコードを書くたびにドキュメントを見ていたので覚えるためにもいったん基本的な使い方をまとめて書いてみることにしました。

今回の内容はすべて
readouble.com
に含まれています。

テーブルはLaravelのデフォルトの認証機能を使用したときのusersテーブルをベースに以下のようなテーブルを想定しています。

カラム名 データ型
id bigint(20) unsigned
name varchar(20)
email varchar(20)

本記事で利用するコードはすべてIlluminate\Support\Facades\DBクラスを使用するため、以下のようにインポート文を追加する必要があります。

use Illuminate\Support\Facades\DB;

クエリビルダの使い方

まずは基本的なSELECTからです

$users = DB::table('users')->get();

このコードは

select * from users;

と同等のクエリが実行されます。これにWhere句を追加したい場合は

$users = DB::table('users')->where('name', '=', 'carametal')->get();

となります。ただ、where句のオペレーターが上記のように「=」の場合は第2引数を省略することができ

$users = DB::table('users')->where('name', 'carametal')->get();

でも同様に動作します。

Where句をid(primary key)で絞る場合は以下のようにfindメソッドが使えます

$user = DB::table('users')->find(1);

getメソッドは結果が1レコードであっても配列を取得するのに対してfindメソッドはオブジェクトを1つだけ取得します。

primary key以外でレコードを絞り込みたいがfindメソッドのようにオブジェクト1つだけを取得したい場合はfirstメソッドを使うことができます

$users = DB::table('users')->where('name', 'carametal')->first();

もしfirstメソッドを使用したのにSQLの結果が複数行あった場合は内部的に一番最初に見つかったレコードのみを返します。今回のテーブルでいうとidが小さいレコードが優先されます。

where句で条件を複数指定したい場合は配列で条件を渡すこともできます。

$users = DB::table('users')->where([['id', 1], ['name', 'carametal']])->get();

where句を複数していすることもできます。

$users = DB::table('users')->where('id', 1)->where('name', 'carametal')->get();

条件指定にorを使いたい場合はorWhereメソッドが用意されています

$users = DB::table('users')->where('id', 1)->orWhere('name', 'carametal')->get();

またSQLの結果を集計したい場合にはcountメソッドやmaxメソッドを使うこともできます。

$count = DB::table('users')->count();

join句はメソッドで用意されています

$user = DB::table('users')->join('contacts', 'user.id', '=', 'contacts.user_id')->select('users.*', 'contacs.phone')->get();

join句もwhere句と同様にオペレータを省略することができます。

$user = DB::table('users')->join('contacts', 'user.id', 'contacts.user_id')->select('users.*', 'contacs.phone')->get();

joinメソッドはinner join、left outer joinはleftJoinメソッド、right outer joinはrightJoinメソッドがそれぞれ用意されているので必要に応じて使い分けることができます。

orderBy句もメソッドで用意されています。

$users = DB::table('users')->orderBy('id', 'desc')->get();

第一引数にカラム名、第二引数に昇順か降順かを指定します。第二引数は省略可能で省略した場合は昇順(asc)になります

またtimestampを採用している場合はlatestメソッド()、oldestメソッドを使ってcreated_atの順にソートすることもできます。

$users = DB::table('users')->latest()->get();

これで基礎的なSELECT実行するクエリビルダの使い方はまとまったかと思います。

このほかにもサブクエリなど応用的なメソッドもたくさんあるので、もっと深めたい方は是非公式ドキュメントをご覧ください。
readouble.com