先日に作成した生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'
)
メルマガ購読の申し込みはこちらから。



