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

この記事からわかること

  • Laravelデータベース操作機能
  • クエリビルダとは?
  • 使い方CRUD記述方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelにおけるデータベース操作機能の1つ「クエリビルダ」の使い方とメリット、CRUDの記述方法をまとめていきたいと思います。

クエリビルダとは?

Laravelではデータベースを操作する機能が複数用意されています。

データベース操作する機能

いずれの機能を使うにもまずはLaravelとデータベースの紐付けは必須です。以下記事を参考にして紐付けを完了させておいてください。

その中でもクエリビルダはSQL言語を使わずphpを扱うかのようにデータベース操作ができるようになっています。またEloquent(エロクアント)と違い前準備の必要がなく簡単に使えるのもメリットの1つと言えます。

クエリビルダのメリットとDBクラスとの違い

クエリビルダのメリット

クエリビルダでのデータベース操作は名前空間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クラスとクエリビルダの違い

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メソッド

レコードを新しく挿入するには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();

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index