はじめに
この記事はlaravelエンジニアが初めてLaravel Telescopeに触れて学習したものをまとめたものです
一部間違いがある可能性もありますがご了承ください
Laravel Telescope とは?
Laravel Telescopeとはリクエスト、SQLクエリ、ログ、例外、メール、ジョブなどを確認できるデバッグ支援ツールです
リクエスト詳細からメール内容、SQLの内容まで確認することができます
普段見えない領域を可視化することができるため作成したものが正しいかの確認がこれ一つですべて済むようになります
導入方法
下記コマンドをLaravelプロジェクトがある箇所でターミナル実行します
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
なおmigrateが含まれている理由はTelescopeで使用するDB内容はmigrateによって起こされるためです
確認方法
下記URLから確認することができます
laravel起動場所/telescope
localhostで起動しているのなら
localhost/telescope
ですね
今回の目標
n+1の内容の確認と修正です
N+1問題とは、最初に一覧取得のクエリを1回実行したあと、関連データを取得するためのクエリがデータ件数分だけ追加で発行されてしまう問題です
これが発生するものを放置していると将来データが増えたときに処理量が増えてしまいます
今回はこのn+1問題を修正する過程をなぞっていきます
ちなみにこれの確認をするために実行クエリを確認する必要があります

今回確認するAPIが赤枠の個所なのでここをクリックし

このようにQueriesとなっている箇所がeloquentで実際にクエリとして実行されている内容です
対応の内容
今回は下記のようなコードを用意しました
$monthTransactions = $this->transaction
->whereBetween('occurred_on', [
$startOfMonth->toDateString(),
$endOfMonth->toDateString(),
])->get();
foreach ($monthTransactions as $monthTransaction)
{
$category = $monthTransaction->category;
...
このクエリのQueriesの内容は

このようになっています
これはModelに紐づいているcategoryの内容を見ています
foreach一周につき検索を行うためクエリの数が多くなっています
これがn+1問題です
これを見ればこの個所が悪いのは明らかなのでここを修正すべきということがわかります
そこで修正箇所を
$monthTransactions = $this->transaction::with('category')
->whereBetween('occurred_on', [
$startOfMonth->toDateString(),
$endOfMonth->toDateString(),
])->get();
foreach ($monthTransactions as $monthTransaction)
{
$category = $monthTransaction->category;
...
というようにwithを使って事前にtransactionとcategoryを紐づけましょう
そうすると実行されたクエリ内容が

このようにクエリ数を圧倒的に下げることができます
こうしてeloquentではみえないクエリパフォーマンスを上げることができます
今回はN+1の改善に絞りましたが他にもTelescopeにできることはたくさんあります
自分も必要に応じて少しずつTelescopeの学習を進めていこうと思います