Laravelのクエリビルダについて記法も含めてまとめてみました。
目次
クエリビルダとは
クエリビルダとは、DBからレコードを取得する際にSQL文を組み立てて問い合わせを行う際に使用される、比較的簡単にSQL文を組み立てることができる機能です。
利点としては、SQL文に詳しくなくてもこの機能を理解していれば簡単にDB操作を行えたり、SQLインジェクションなどの攻撃への問題などを解決してくれたりします。
上記の利点から直接SQLクエリを実行するような書き方は極力避け、クエリビルダを使用した設計をする方がオススメです。
クエリビルダの基本書式
クエリビルダの基本的な書式を以下に記載致します。
1 2 3 4 5 6 7 8 |
use Illuminate\Support\Facades\DB; // DBFacadesをuseしましょう。 public function index() { // テーブルを指定しましょう。 // $変数 = DB::table(テーブル名)->get(); $people = DB::table('people')->get(); } |
まず、DBFacadesをuseし、次にDBFacadesメソッドを使用し、引数に取得したいDBのテーブル名を記載します。
DB::tableは「Builder」クラスのインスタンスを返します。そこからgetというメソッドを呼びだすことで、全レコードを取得します。
この「Builder」がクエリビルダの機能を提供します。
データ取得メソッド
Laravelのクエリビルダには以下の取得メソッドがあります。
get()
条件に沿ったデータを全て取得します。
1 |
$data = $people->get(); |
first()
結果データの最初の1件のみを取得します。
1 |
$data = $people->first(); |
pluck()
指定したカラム1つだけをコレクションで取得します。
1 |
$data = $people->pluck('age'); |
ただし、1カラムの全レコードを全て取得するので、一件だけ欲しい場合は下記で記載しているget()を使用ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 取り出し結果 array ( [0] => 21 [1] => 25 [2] => 30 [3] => 18 [4] => 51 [5] => 27 [6] => 44 [7] => 38 [8] => 52 ) |
また、第一引数に取得したいカラム・第二引数にプロパティカラムを指定すると、他カラムと紐づいた状態でデータを取得することが可能です。
1 |
$data = $people->pluck('age', 'name'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 取り出し結果 array ( [people00] => 21 [people01] => 25 [people02] => 30 [people03] => 18 [people04] => 51 [people05] => 27 [people06] => 44 [people07] => 38 [people08] => 52 ) |
get()
指定したカラム1つだけを取得します。
1 |
$data = $people->value('age'); |
こちらはpluckメソッドと違い、1件のみを取得するので、where句などと併用して狙った1件を取得する際に使用するのをおすすめします。
exists()
existsメソッドを使用すると条件に対して、該当レコードが存在するか確認することができます。
1 |
$data = $people->exists(); |
レコードが存在したら$dataにTrueが、存在しなければFalseが返ります。
1 2 3 4 5 |
if (True === $data) { // レコードが存在する場合 } else { // レコードが存在しない場合 } |
doesntExist()
doesntExistメソッドはexistsメソッドの反対を返します。レコードが存在しない場合はTrueを、存在したらFalseを返却します。
1 |
$data = $people->doesntExist(); |
chunk()
扱うデータの量が膨大になってくると、すべてのデータを取り出して繰り返しなどで延々と処理していくのはかなり大変です。
そのような場合はchunkメソッドを使用すれば、検索結果を一定数ごとに分割することが可能です。
1 2 3 4 5 |
$people->orderBy('id')->chunk(30, function ($people) { foreach ($people as $person) { // 処理 } }); |
これでもしpeopleテーブルにレコードが1000件や10000件を超えていたとして、30件ずつ取り出して処理を行うことが可能です。
集計方法
laravelのクエリビルダにはある程度集計メソッドが事前に準備されております。
count()
countメソッドはレコードの件数を取得することができます。
1 |
$peopleCount = $people->count(); |
max()
maxメソッドは指定したカラムの最大値を取得することができます。
1 |
$ageMax = $people->max(age); |
min()
minメソッドは指定したカラムの最小値を取得することができます。
1 |
$ageMin = $people->min(age); |
avg()
avgメソッドは指定したカラムの平均値を取得することができます。
1 |
$ageAvg = $people->avg(age); |
sum()
sumメソッドは指定したカラムの合計値を取得することができます。
1 |
$ageSum = $people->sum(age); |
色々なWhere
レコードの検索にはwhereメソッドを使用して行います。whereメソッドは比較的多くのものが準備されており、覚えておくとより柔軟な検索ができるようになります。
where()
whereメソッドはwhere句に相当するもので、このwhereは引数にフィールド名と値を指定することで、指定された条件に合致するレコードを絞り込むことが可能です。
1 |
where(フィールド名 , 値); |
これにより指定したフィールドの値が第二引数の値と同じレコードを検索することが可能です。
また、演算記号を指定した検索も可能です。
1 |
where(フィールド名 , 演算記号, 値); |
orWhere
より複雑な検索として「複数の条件を設定する」という場合もあるかと思います。この場合はwhereとorWhereを使用して設定できます。
全ての条件に合致するものだけを検索
1 |
where(……)->where(……) |
複数の条件を設定し、すべての条件に合致したものだけを検索する場合は、このようにwhereメソッドを複数続けて記載していきます。
条件に一つでも合致すれば全て検索
1 |
where(……)->orWhere(……) |
複数の条件のうちどれか一つでも合致すれば全て検索する場合は、最初にwhereで条件を指定し、その後にorWhereを使って条件を追加します。
1 2 3 4 |
$twenties = $people ->where('age', '>', 20) ->orWhere('age', '>', 30) ->get(); |
whereRaw()
検索条件が複雑になった場合は、いくつもwhereを続けて記載するより複数の条件を文字列で指定するwhereRawメソッドの方が役立つ場合もあります。
1 |
whereRaw(条件式 , パラメーター配列); |
第一引数に検索のための式を用意し、第二引数にパラメータの配列を用意します。
1 2 3 4 |
$twenties = $people ->whereRaw('age > ? and > ?', [20, 30]) ->get(); |
whereBetween()
「○○以上○○以下」というような最小値と最大値を指定してその範囲内を検索したいというのは頻繁にあります。クエリビルダではそのためのメソッドも用意されております。
2つの値の範囲内を検索
1 2 |
whereBetween(フィールド名 , [ 最小値 , 最大値 ]); orWhereBetween(フィールド名 , [ 最小値 , 最大値 ]); |
1 2 3 |
$twenties = $people ->whereBetween('age', [20, 30]) ->get(); |
2つの値の範囲外を検索
1 2 |
whereNotBetween(フィールド名 , [ 最小値 , 最大値 ]); orWhereNotBetween(フィールド名 , [ 最小値 , 最大値 ]); |
1 2 3 |
$NotTwenties = $people ->whereNotBetween('age', [20, 30]) ->get(); |
orが付いたメソッドは他の条件の後にor検索で繋げます。いずれも第二引数に最小値と最大値を配列にまとめて指定します。
whereIn()
「○○の値が✖✖や△△や□□」のような複数の値を探す場合はwhereメソッドで行おうとすると冗長になってしまいます。
その場合はwhereInメソッドを使用しましょう。
配列に含まれている値と等しいものを検索
1 2 |
whereIn(フィールド名 , [ 値の配列 ]); orWhereIn(フィールド名 , [ 値の配列 ]); |
1 2 3 |
$twenties = $people ->whereIn('age', [20, 21, 22, 23, 24, 25]) ->get(); |
配列に含まれている値と等しいもの以外を検索
1 2 |
whereNotIn(フィールド名 , [ 値の配列 ]); orWhereNotIn(フィールド名 , [ 値の配列 ]); |
1 2 3 |
$NotTwenties = $people ->whereNotIn('age', [20, 21, 22, 23, 24, 25]) ->get(); |
whereNull()
値がnullかどうかをチェックするためのwhereも用意されています。
特定の項目がnullなもの、あるいはnull出ないものを簡単に絞りこむことができます。
特定フィールドがnullなものを検索
1 2 |
whereNull(フィールド名); orWhereNull(フィールド名); |
特定フィールドがnullでないものを検索
1 2 |
whereNotNull(フィールド名); orWhereNotNull(フィールド名); |
日時のチェック
日時のチェックをするためのwhereも用意されております。
日付のチェック
1 |
whereDate(フィールド名, 値); |
年のチェック
1 |
whereYear(フィールド名, 値); |
月のチェック
1 |
whereMonth(フィールド名, 値); |
日のチェック
1 |
whereDay(フィールド名, 値); |
時刻のチェック
1 |
whereTime(フィールド名, 値); |
並び順を指定するorderBy
レコードを検索して取得する場合、取り出されるレコードは基本的に作成した順番になっています。この並び順を変更したい場合は、「orderBy」メソッドを使用しましょう。
orderBy()
1 |
orderBy(フィールド名, 'asc又はdesc'); |
第一引数には並び順の基準となるフィールド名を指定し、第二引数には’asc’又は’desc’を指定します。
asc | 昇順 |
desc | 降順 |
offset()
offsetは指定した位置からレコードを取得するためのものとなります。
1 |
offset( 整数 ) |
1 2 3 |
$data = $people ->offset($request->page * 3) ->get(); |
limit()
指定した数だけレコードを取得します。
1 |
limit( 整数 ) |
1 2 3 |
$data = $people ->limit(5) ->get(); |