先日に作成した生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'
  )

By khino