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

LaravelLaravel

LaravelでEloquentを使わずに、DBファサードを使用してSQLを実行する方法について書いています。
公式サイトのこちらに書いている内容になります。

PR

DBファサードを使用して、SQLを実行する準備

DBファサードを使用することで、Eloquentを使わなくてもSQLを実行することが可能です。
DBファサードを使用するにはIlluminate\Support\Facades\DBをuse文で読み込んでおきます。

use Illuminate\Support\Facades\DB;
PR

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

コメント

Ads Blocker Image Powered by Code Help Pro

広告ブロッカーが検出されました。

ブラウザの拡張機能を使用して広告ブロックをしていることが確認できました。 ブラウザの広告ブロッカー機能を無効にしていただくか、codelikes.comをホワイトリストに追加し、更新をクリックしてください。 お手数ですが、よろしくお願いします🙇‍♂️
タイトルとURLをコピーしました