LaravelでEloquentを使わずに、DBファサードを使用してSQLを実行する方法について書いています。
公式サイトのこちらに書いている内容になります。
DBファサードを使用して、SQLを実行する準備
DBファサードを使用することで、Eloquentを使わなくてもSQLを実行することが可能です。
DBファサードを使用するにはIlluminate\Support\Facades\DB
をuse文で読み込んでおきます。
use Illuminate\Support\Facades\DB;
データを取得(Select)する
データを取得する場合は、下記のように書きます。
$result = DB::select("select * from users");
dd($result);
DBファサードのselectメソッドに、引数でSQLのセレクト文を渡すことで実行可能です。
即時実行されて、結果が返ってきます。
usersテーブルには、3人分のユーザーデータを格納しています。
上記の結果、ddヘルパーで出力すると、下記のようになりました。
^ array:3 [▼
0 => {#287 ▼
+"id": 1
+"name": "Mr. Lesley D'Amore"
+"email": "favian.greenfelder@example.net"
+"email_verified_at": "2022-05-16 13:54:55"
+"password": "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
+"remember_token": "CK0gqRQxWP"
+"created_at": "2022-05-16 13:54:55"
+"updated_at": "2022-05-16 13:54:55"
}
1 => {#288 ▼
+"id": 2
+"name": "Terence Reinger"
+"email": "douglas75@example.net"
+"email_verified_at": "2022-05-16 13:54:55"
+"password": "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
+"remember_token": "52AVdIXmZY"
+"created_at": "2022-05-16 13:54:55"
+"updated_at": "2022-05-16 13:54:55"
}
2 => {#289 ▼
+"id": 3
+"name": "Prof. Albertha Huel"
+"email": "gulgowski.parker@example.net"
+"email_verified_at": "2022-05-16 13:54:55"
+"password": "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
+"remember_token": "mvDCuCsOd1"
+"created_at": "2022-05-16 13:54:55"
+"updated_at": "2022-05-16 13:54:55"
}
]
返ってくるデータはPHPのオブジェクト形式(stdClass)になっています。
なので、使用する時にはインスタンスのプロパティにアクセスする形で、値を取得できます。
dd($result[0]->name); // 「Mr. Lesley D'Amore」が出力される
バインドパラメータを使う
selectメソッドの第2引数に、配列で値を渡すことでバインドパラメータとして使用できます。
バインドパラメータを使用することで、SQLインジェクションを防ぐことが可能です。
$result = DB::select("select * from users where id = ?", [2]);
上記のSQLを実行すると、このようになります。
「?
」の箇所に、渡された内容が埋め込まれて実行されます。
select * from users where id = 2
複数のパラメータを渡す場合は、渡す分だけ「?
」を増やして、配列に値を複数並べます。
$result = DB::select("select * from users where id = ? and email = ?", [2, 'douglas75@example.net']);
名前付きバインドパラメータを使う
SQLパラメータを「?
」ではなく、それぞれに名前をつけて渡すことが可能です。
名前付きバインドパラメータを使用する場合は、このように書きます。
$params = ["id" => 2, "email" => 'douglas75@example.net'];
$result = DB::select("select * from users where id = :id and email = :email", $params);
第2引数を連想配列で渡します。
SQLの「:id
」や「:email
」の箇所に、連想配列のキーになっている値が埋め込まれます。
データを追加(Insert)する
データを追加する場合はinsertメソッドを使用します。
バインドパラメータを使用して、インサートする値を「?」にします。
そして、実際に追加する値を第2引数に渡します。
DB::insert('insert into fruits (name, color, price) values (?, ?, ?)', ['りんご', 'red', 110]);
こちらも名前付きバインドパラメータを使うこともできます。
$params = ['name' => 'バナナ', 'color' => 'yellow', 'price' => 120];
DB::insert('insert into fruits (name, color, price) values (:name, :color, :price)', $params);
データを更新(Update)する
データを更新する場合はupdateメソッドを使用します。
同様にしてバインドパラメータを使用して、更新する箇所を「?」で埋めたSQLを第1引数に渡します。
第2引数にupdate文で使うパラメータを、配列で下記のように渡します。
$affected = DB::update('update fruits set name = ?, color = ? where name = ?', ['いちご', 'red','バナナ']);
実行すると、更新された行数が返ってきます。
データを削除(Delete)する
データを削除する場合はdeleteメソッドを使用します。
実行すると、返り値として削除された行数が返ってきます。
$deleted = DB::delete('delete from fruits');
値を返さないSQL文を実行する
dropなどの値を返さないSQL文を実行したい場合には、statementメソッドを使用します。
DB::statement('drop table fruits');
トランザクションを張る
終わりに
基本的にはEloquentに慣れると使い勝手が良く、コードも見やすくなると思うので、Eloquentがおすすめです。
複雑なSQLを書く場合や既にあるシステムの移行などで、時間的な制約がある場合などに使うと良いのではないでしょうか。
コメント