Top View


Author sakuragawa

LaravelでSQLを直接実行したい場合にSQLをどこに置くのか?

2020/12/07

SQL実行方法パターン

  1. eloquentを駆使して頑張る
  2. QueryBuilderで構築する
  3. 直接SQLを書いて実行する

1. eloquentを駆使して頑張る

モデルにリレーションを書いて頑張れば行けばできなくはないかもしれないですが、「リレーション先に条件をかける」や「サブクエリを実行する」等々出てくると、SQLより書く内容が複雑になるし、SQLの実行速度も遅くなりメリットないなーと思ってます。

2. QueryBuilderで構築する

QueryBuilderを使うは別に悪くないと思ってますが、自分はある程度の規模のSQLを組む時いきなりQueryBuilderを組まずにSQLを組んでからQueryBuilderに書き直します。
PHP上の可読性とのバランスになってくると思いますが、1000行くらいであればQueryBuilderに起こしなおさなくてもいいかなーと思ってます。

3. 直接SQLを書いて実行する

自分はこれを選択してます。
※あくまでも、SQLが複雑な場合に限定して使用しています。 なので、自分は「規模」「複雑度」等々に応じて eloquentQueryBuilderSQL を使い分けてます。

本題のSQLをどこに置くのか?

自分は resources にSQLファイルを外だししてSQLを読み込んで実行する方法をとってます。 PHP上にいきなりSQLが出てくると読みにくいかなーと考えているからです。

また、SQLを読み込む処理は毎回同じコードになるので、パッケージ化「kozo/liberation」して使用してます。

使い方

1. インストール

composer require kozo/liberation

2. SQLファイルの設置

-- ここにごっついSQLを記述
select * from example

3. SQLファイルの読み込み + 実行

// QueryBuilderから直接SQLファイル読み込み + SQL実行
$bindParams = [];  // SQLにbindする値
$bladeParams = [];  // bladeで利用する値
$rows = DB::query()->sql('example', $bindParams, $bladeParams);

こんな風にしておけば、ある程度シンプルにまとまってないですかね?

それぞれのやり方にメリット・デメリットが存在していると思います。
「こんなやり方がいいのでは?」等々あれば教えてください!

sakuragawa

sakuragawa

PHPエンジニアです。