下記のようにeager loadingを使ってデータを取得しようとした時、にメインのクエリしかキャッシュされていないことに気づきました。
調べてみると、それぞれキャッシュする方法があるようです。
修正前
下記の場合、rankingのmodelから取得するクエリはキャッシュされるのですが、postやuserを取得するクエリはキャッシュされません。
キャッシュされない
// 省略
$data = $this->ranking
->with('post', 'post.user')
->remember(Config::get('lifetime'))
->get();
$records = [];
foreach ($data as $record) {
$records[] = [
'rank' => $record->rank,
'postImage' => $record->post->image,
'userID' => $record->post->user->id
];
}
// 省略
発行されるクエリ
select * from `ranking` order by `id` asc; // キャッシュされる
select * from `posts` where `posts`.`deleted_at` is null and `posts`.`id` in (?, ?, ?, ?) // キャッシュされない
select * from `users` where `users`.`deleted_at` is null and `users`.`id` in (?, ?, ?, ?) // キャッシュされない
修正後
withの部分を変更します。
キャッシュされる
// 省略
$data = $this->ranking
->with(['post' => function($query) {
$query->remember(Config::get('lifetime'));
$query->with(['user' => function($sub_query) {
$sub_query->remember(Config::get('lifetime'));
}]);
}])
->remember(Config::get('lifetime'))
->get();
// 省略
これで無事、全てのクエリがキャッシュされるようになったはず。