【Laravel】DBクラスの使い方とメリットとは?CRUD処理とSQL文

この記事からわかること

  • Laravelデータベース操作機能
  • DBクラスとは?
  • 使い方CRUD記述方法

index

[open]

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

みんなの誕生日

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

posted withアプリーチ

今回は一番とっつきやすく、データベース操作らしい「DBクラス」の使い方とメリットについてまとめていきたいと思います。

DBクラスとは?

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

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

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

機能の中でも「DBクラス」は小難しい機能はなく、SQLを理解していれば簡単にデータベース操作が可能になります。また前準備が不要で接続さえ終了していたらuse文で組み込むだけでどこでも使える手軽さと便利さを兼ね備えています。

DBクラスのメリット

DBクラスでのデータベース操作は名前空間Illuminate\Support\Facades\DBに定義されているDBファサードのメソッドを使って実行していきます。ファサードとは共通で使えるように定義してあるクラスに対して安全に使えるように中継してくれている機能(静的プロキシ)のことです。

クエリビルダでもDBファサード(クラス)のメソッドを使って記述していきますが使い方が異なります。今回はクエリビルダではない使い方をみていきます。

DBクラスの使い方

使用するにはuse文を追加してDBクラスを使えるようにしておきます。DBファサード以外でもファサードは同様にuse Illuminate\Support\Facades\○○○;形式で読み込まないと使えないので注意してください。

use Illuminate\Support\Facades\DB;

読み込みが終了したら以下のようにして使用します。例えばこれは全レコードを取得する際のステートメントです。

$records = DB::select('SELECT * FROM テーブル名');

このようにDBクラスを用いてのデータベース操作はDBクラスの静的メソッド(::)を使用して実行します。指定したSQL文を実行したレコード取得結果が戻り値としてオブジェクト形式の配列(stdClass)として返されます。

var_dump($records);
//結果:array(1) { [0]=> object(stdClass)#277 (8)...

簡潔に書くと以下の通りのようなオブジェクト形式の配列が返ってくるということです。

[
  {"user_id":1,"name":"ame"},
  {"user_id":2,"name":"taro"},
  {"user_id":3,"name":"yuko"},
  {"user_id":4,"name":"ren"},
  {"user_id":5,"name":"yoshiki"},
]

取得したレコードをbladeファイルに渡す

取得したレコードをbladeファイルで表示させてみます。まずは適当なコントローラーを作成しておきます。

$ php artisan make:controller welcomeController

web.php

Route::get('/index', 'App\Http\Controllers\welcomeController@index');

welcomeController.blade.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class welcomeController extends Controller
{
    public function index()
    {
        $users = DB::select('SELECT * FROM users');
        return view('index', ['users' => $users]);
    }
}

コントローラにはDBファサードのuse文を追加するだけで接続設定をしたデータベースにアクセスできるようになります。

DBクラスの静的メソッドでレコードを取得したら一度変数に格納し、viewメソッドの引数にアクセスするためのキー値とデータを渡してあげます。

index.blade.php

<body>
  <h1>Index</h1>
  @foreach ($users as $user)
    <p>{{$user->user_id}}</p>
    <p>{{$user->name}}</p>
  @endforeach
</body>

bladeテンプレート側ではコントローラで指定したキー値の変数を@foreachを使って取り出します。特手のカラムを取り出す場合は$item->カラム名で取り出すことができます。

コントローラ内でレコードのカラムを取得する

bladeファイルに渡す前にコントローラ内でレコードにアクセスするにはbladeテンプレートのようにオブジェクトをforeachでループさせカラム名のプロパティを指定すれば取得することができます。

foreach ($users as $user) {
  echo $user->name;
}

DBクラスのCRUD処理の記述方法

データベース操作の基本となるCRUD(クラッド)処理を実現する方法を見ていきます。

DBクラスの場合はCRUD処理の1つ1つに該当した静的メソッドが用意されています。その引数としてSQL文を記述すれば思い通りに実行させることができます。

Create→insert

レコードを新しく挿入するにはinsertメソッドを使用します。

DB::insert('INSERT INTO テーブル名 VALUES "値"');

挿入する値を変数で受け渡すには適当な変数(今回は$param)に連想配列で格納しDB::insertの第二引数に指定します。続いてVALUESの後に連想配列のキー値を:キー値形式で記述すればOKです。

$param = [
    // 入力値も受け渡し可能
    'column1' => $request->input('text'),
    'column2' => 'Laravel',
];
DB::insert('INSERT INTO テーブル名 (カラム1,カラム2) VALUES (:column1,:column2)', $param);

この方法による値の受け渡しには内部的にPDOで実行されており、SQLインジェクションを自動保護してくれます。

Read→select

レコードの値を取得するにはselectメソッドを使用します。

$records = DB::select('SELECT * FROM テーブル名');

取得したいレコードに条件を設けたい時は通常のSQL文のようにWHERE句を使って指定すればOKです。

$records = DB::select('SELECT * FROM テーブル名 WHERE user_id = "値"');

DBクラスを用いてのデータベース操作はSQLが分かっている人からすると複雑な条件式やテーブル結合もしやすく使い勝手が良いです。

Update→update

レコードの値を更新するにはupdateメソッドを使用します。

DB::update('UPDATE テーブル名 SET column1 = "値"');

Delete→delete

レコードを削除するにはdeleteメソッドを使用します。

DB::delete('DELETE FROM テーブル名 WHERE column1 = "値"');

インサートして増えたid値を取得する

インサート処理をしたときにオートインクリメント(自動増分)されたidの値を取得するにはDB::getPdo()メソッドのlastInsertIdメソッドで取得できます。

$insertId = DB::getPdo()->lastInsertId();

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

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

searchbox

スポンサー

ProFile

ame

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

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

New Article

index