Laravel9 リレーション時のSQLを確認する方法

こんなリレーションがあったとして

products            categories
    id -----┐        id
            └------- category_id
                      name

Productモデルに以下のようなbelongsToリレーションの定義をしていたとして

    public function category()
    {
        $category = $this->belongsTo(Category::class)->withDefault();
                return $category;
    }

通常、以下のコードでproductレコードに紐づくcategoryレコードを抽出可能だけど、正常にcategoryレコードが抽出できない時、belongsToが正しく機能しているか実際に発行されたSQLを確認したくなる。

// productsの1レコード取得
$product = Product::find(1);
// productレコードに紐づくcategoryレコードを抽出
$category = $product->category;

以下のようにクエリログを吐き出すようにして確認すればOK

use DB;
  ・
  ・
  ・

// クエリログを有効
DB::enableQueryLog();

// productsの1レコード取得
$product = Product::find(1);
// productレコードに紐づくcategoryレコードを抽出
$category = $product->category;

// 実行された全てのクエリのログを取得
$queryLog = DB::getQueryLog();

// 最後に実行されたクエリを取得
$lastQuery = end($queryLog);

// クエリログを出力
dd($lastQuery);

以下のようにSQLが正しく発行されていることが確認できる

array:3 [▼ // app\Http\Controllers\XxxxxController.php:35
  "query" => "select * from `categories` where `categories`.`id` = ? limit 1"
  "bindings" => array:1 [▼
    0 => 2
  ]
  "time" => 0.5
]

クエリログを確認することはリレーション時にのみ有効という訳ではないけど、他のケースの場合はもっと楽にSQLを確認できる方法があるので。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です