【laravel】素のSQLについて

みなさま、あけましておめでとうございます。

2023年が始まりましたね。

 

最近は、仕事も私用のことでも考えることがいっぱいでバタバタの2023年の幕開けとなりました。

今年はどんな年になるのか楽しみです。

 

早速、今回はlaravelの素のSQLについてまとめていきたいと思います。

先日、クエリビルダでSQLを作成していたのですが、

作成したクエリビルダに間違いはないはずなのになぜか取得した結果が違う、、、という事象が起きました。

デバッグでどんなSQLを発行しているのか取得してそのSQLを実行してみると思った通りの結果が出るのですが、laravelのクエリビルダで記述した結果は異なるものになっていました。

そこで素のSQLを記述して結果を取得することにしました。

 

素のSQL

素の文字列式を作成するには、DBファサードが提供する「raw」メソッドを使用します。

 

rawメソッド

DB::rawメソッドを使用する代わりに以下のメソッドを使用しても素のSQLを挿入することもできるようです。

素の式を使用するクエリでは、SQLインジェクションの脆弱性からの保護が必要です。

SQLインジェクションとは?

アプリケーションの脆弱性により本来の意図ではない不当な「SQL」文が作成されてしまい、

「注入(injection)」されることによって、データベースのデータを不正に操作される攻撃のことをいいます。

以下のrawメソッドでは、2番目の引数に配列で入れたい値を入れることでそれを防ぐことができます。

 

selectRaw

addselect(DB::raw())の代わりにselectRawメソッドを使用できます。

2番目の引数に配列で入れたい値を入れると、素のSQLで「?」を記述したところに配列に設定した値を代入してくれます。

以下のrawメソッドでも同じです。

$users = DB::table('items')
  ->selectRaw('price * ? as price_with_tax', [1.1])
  ->get();

whereRaw / orWhereRaw

whereRawメソッドとorWhereRawメソッドを使用して、素のwhere句をクエリに挿入できます。

$users = DB::table('users')
  ->whereRaw('user_id = ?', [100])
  ->get();

 

havingRaw / orHavingRaw

havingRawメソッドとorHavingRawメソッドを使用して、素のhaving句の値として素の文字列を指定できます。

$items = DB::table('items')
  ->select('item_name')
  ->havingRaw('price >= ?', [5000])
  ->get();

素のSQLをどうしても書かないといけなくなってしまった場合に、SQLインジェクションの脆弱性の保護さえ行っていれば

簡単に実装できるのでぜひ参考になればうれしいです。