こんなリレーションがあったとして
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を確認できる方法があるので。