Fusic Tech Blog

Fusion of Society, IT and Culture

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

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

この記事はFusic Advent Calenderの7日目の記事です。 昨日は走るエンジニア@masayuki031さんの記事、Wordpressより19倍高速なghostの紹介でした。 Wordpressを利用している人は触ってみてはどうでしょうか?


さて今回は「LaravelでSQLを直接実行したい場合にSQLをどこに書くのか?」とういう内容で記事を書いてみました。

そもそもSQLを直接書くのはNGよ。
などの意見もあると思いますが今回はSQLを直接書くことを前提としています。

各画面を構築する場合などは、eloquent を実行して構築するとして、 集計機能などで、SQLが複雑になりが例えば1000行程度になった場合皆さんどうやってSQLを組み立ててるんですかね?
大きく次の3つに分類されてると思いますが、個人的にはタイトルにある通りSQLを直接実行した方法ががいいのではと思ってます。

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エンジニアです。