【Laravel】DBクラスの使い方とメリットとは?CRUD処理とSQL文
この記事からわかること
- Laravelのデータベース操作機能
- DBクラスとは?
- 使い方とCRUDの記述方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
今回は一番とっつきやすく、データベース操作らしい「DBクラス」の使い方とメリットについてまとめていきたいと思います。
DBクラスとは?
Laravelではデータベースを操作する機能が複数用意されています。
データベース操作する機能
- DBクラス
- DBクラス(クエリビルダ)
- Eloquent(エロクアント)
いずれの機能を使うにもまずはLaravelとデータベースの紐付けは必須です。以下記事を参考にして紐付けを完了させておいてください。
機能の中でも「DBクラス」は小難しい機能はなく、SQLを理解していれば簡単にデータベース操作が可能になります。また前準備が不要で接続さえ終了していたらuse文
で組み込むだけでどこでも使える手軽さと便利さを兼ね備えています。
DBクラスのメリット
- 前準備が不要
- SQL文をそのまま使える
- use文で組み込めばどこでも使える
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(クラッド)処理を実現する方法を見ていきます。
- Create→insert
- Read→select
- Update→update
- Delete→delete
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();
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。