【Laravel】クエリビルダの使い方とメリットとは?DBクラスとの違い

この記事からわかること
- Laravelのデータベース操作機能
- クエリビルダとは?
- 使い方とCRUDの記述方法
index
[open]
\ アプリをリリースしました /
Laravelにおけるデータベース操作機能の1つ「クエリビルダ」の使い方とメリット、CRUDの記述方法をまとめていきたいと思います。
クエリビルダとは?
Laravelではデータベースを操作する機能が複数用意されています。
データベース操作する機能
- DBクラス
- DBクラス(クエリビルダ)
- Eloquent(エロクアント)
いずれの機能を使うにもまずはLaravelとデータベースの紐付けは必須です。以下記事を参考にして紐付けを完了させておいてください。
その中でもクエリビルダはSQL言語を使わずphpを扱うかのようにデータベース操作ができるようになっています。またEloquent(エロクアント)と違い前準備の必要がなく簡単に使えるのもメリットの1つと言えます。
クエリビルダのメリットとDBクラスとの違い
クエリビルダのメリット
- 前準備が不要
- php構文を扱うように操作可能
- use文で組み込むだけでどこでも使える
- SQLインジェクションを自動保護
- SQLがかけなくても使用可能
- 返り値がコレクションに格納される
クエリビルダでのデータベース操作は名前空間Illuminate\Support\Facades\DB
に定義されているDBファサード(クラス)
のメソッドを使って実行していきます。ファサードとは共通で使えるように定義してあるクラスに対して安全に使えるように中継してくれている機能(静的プロキシ)のことです。
DBクラスはCRUDに応じた静的メソッドを使用しますがクエリビルダでは静的メソッドtableのみを使用します。そこからメソッドチェーンで繋いでデータベース操作のステートメントを構築します。
tableメソッド
を使用すると指定されたテーブルのクエリビルダインスタンスを返します。ここからビルダの決められたメソッドを呼び出すことで内部的にSQL文を構築してくれる仕組みになっています。
var_dump(DB::table('テーブル名'));
// 結果:object(Illuminate\Database\Query\Builder)#276 (24) { ["connection"]=> object(Illuminate\Database\....
DBクラスとクエリビルダの違い
- 静的メソッドはtableのみ
- メソッドチェーンで繋ぐ
- SQL文は使わない
- DBファサード(クラス)を使う点は一緒
- 返り値がDBクラスはstdClass/クエリビルダはCollection
DBクラスとの大きな違いはSQL文を使うか使わないかです。SQL文が得意な人はDBクラスのそれぞれCRUDメソッドを使って処理するのがわかりやすく楽かもしれません。
クエリビルダの使い方
クエリビルダを使用するにはファイルの上部にuse
文を追加してDBクラスを使えるようにしておきます。これでDBクラスのCRUDメソッドとクエリビルダ両方が使えるようになります。
use Illuminate\Support\Facades\DB;
実際の使用例を見てみます。これは全レコードを取得する際のステートメントです。
$records = DB::table('テーブル名')->get();
tableメソッド
の引数には取得したいテーブル名を渡します。これで指定したテーブルを操作するクエリビルダが返ってくるのでgetメソッド
を使ってレコードを取得することができます。(SQLのselect文)
戻ってくるのはコレクション(collection)形式の配列です。コレクション(collection)とはLaravel独自の配列操作を拡張できる形式で、その中にstdClass
として各レコードの値がオブジェクト形式に整形されて格納されています。
$records = DB::table('テーブル名')->get();
var_dump($records);
// 結果:object(Illuminate\Support\Collection)#277 (2) { ["items":protected]=> array(1) { [0]=> object(stdClass)#279....
DBクラスのselectメソッド
を使用した場合はcollectionに格納されずstdClassが返ってきます。
$records = DB::select('
SELECT * FROM テーブル名
'); var_dump($records); //結果:array(1) { [0]=> object(stdClass)#277 (8)...
クエリビルダのCRUD処理の記述方法
クエリビルダにおいてのデータベース操作の基礎、CRUD(クラッド)処理の記述方法を見ていきます。
- Create→insertメソッド
- Read→getメソッド
- Update→updateメソッド
- Delete→deleteメソッド
Create→insertメソッド
レコードを新しく挿入するにはinsertメソッド
を使用します。
DB::table('テーブル名')->insert(データ配列);
挿入する値を配列で一度作成し、insertメソッドの引数に渡せばOKです。
$param = [
// 入力値も受け渡し可能
'column1' => $request->input('text'),
'column2' => 'Laravel',
];
DB::table('テーブル名')->insert($param);
Read→getメソッド
レコードの値を取得するにはgetメソッド
を使用します。引数に何も指定しなければ全カラムを取得します。
$records = DB::table('テーブル名')->get();
getメソッド
の引数にカラム名を指定すれば希望の行だけを含んだレコードを取得することも可能です。
$records = DB::table('テーブル名')
->get(['column1,column2']);
whereメソッドで条件を絞り込む
whereの条件にあったレコードを取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値");
whereの条件にマッチする1行のみ取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->first();
whereの条件にマッチするレコードを制限して取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->limit(数値);
whereの条件にマッチするレコードを並び替えて取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->orderBy("カラム名","asc or desc");
whereの条件を式にする
$records = DB::table('テーブル名')
->get()
->where("カラム名","演算子","値");
$records = DB::table('テーブル名')
->get()
->where("price",">","200");
whereの条件をlike検索
$records = DB::table('テーブル名')
->get()
->where("カラム名","like","%値%")
whereの条件を複数設ける
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->where("カラム名","値");
whereの条件に1つでもマッチするものを取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->orWhere("カラム名","値");
whereの条件に1つでもマッチするものを取得
$records = DB::table('テーブル名')
->get()
->where("カラム名","値")
->orWhere("カラム名","値");
Update→updateメソッド
レコードの値を更新するにはupdateメソッド
を使用します。
DB::table('テーブル名')->update(データ配列);
挿入する値を配列で一度作成し、updateメソッドの引数に渡せばOKです。
$param = [
// 入力値も受け渡し可能
'column1' => $request->input('text'),
'column2' => 'Laravel',
];
DB::table('テーブル名')
->where("更新したいレコードを絞り込む条件")
->update($param);
Delete→deleteメソッド
レコードを削除するにはdeleteメソッド
を使用します。
DB::table('テーブル名')
->where("削除したいレコードを絞り込む条件")
->delete();
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。