先日に作成した生SQL文の実行クエリの機能を使用しています。重宝していますが、SQL文が複雑になってくると括弧が多くなってきたりして、わかりづらくなってきます。PHPのコードやHTMLソースと同じようなもので、SQL文の整形の機能が必要です。探したらまさにそのパッケージありました。
まず、私が使用している機能とはこちらのことです。
SQL文を画面で入力して安全に実行して結果を返す
そこで掲載されているSQL文の例はごく簡単なのですが、例えばこんなのは、どうでしょう。
サブクエリーがあるし少々複雑。このSQL文にあるパッケージを適用すると、このようになります。
とても見やすい!
そのパッケージとは、以下のSQLフォーマッターです。
https://github.com/doctrine/sql-formatter
インストールはとても簡単。
$ composer require doctrine/sql-formatter
使用もとても簡単です。
... use Doctrine\SqlFormatter\SqlFormatter; ... class QueryController extends Controller { /** * 表示 * * @param \App\Models\Query $query * @return \Illuminate\Contracts\View\View */ public function show(Query $query) { $query->sql = (new SqlFormatter)->format($query->sql); // ここで整形 return view('admin.query_show') ->with(compact('page', 'query')); } ... }
表示では、先に掲載したようにSQL文の整形だけでなく、selectやfromなどのSQLのリザーブワードを太文字にするなどのシンタックスハイライトもしてくれます。また、SQL文が間違っているなら、赤文字で表示もしてくれます。以下は最後の閉める括弧が足りないときです。
HTMLタグを伴う出力が要らずに、SQL文の整形のみが必要なら(保存のときに便利)、
... use Doctrine\SqlFormatter\NullHighlighter; use Doctrine\SqlFormatter\SqlFormatter; ... echo (new SqlFormatter(new NullHighlighter()))->format($query->sql); ...
とコードします。その出力は以下のようになります。
select invoice_id, invoice_status, invoice_date from invoice where invoice_status = 5 and invoice_date between '2019-01-01' and '2022-02-01' and invoice_id not in ( select invoice.invoice_id from invoice_member inner join invoice on invoice_member.invoice_id = invoice.invoice_id where invoice_status = 5 and invoice_date between '2019-01-01' and '2022-02-01' )メルマガ購読の申し込みはこちらから。