LaravelでEloquentを使わずにSQLを実行する方法!

Laravel Laravel

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を書く場合や既にあるシステムの移行などで、時間的な制約がある場合などに使うと良いのではないでしょうか。

コメント

タイトルとURLをコピーしました