随着 Laravel 11 在 2024 年 2 月发布,Laravel 将原生支持限制每个父级模型的预加载结果数量。
我们将 @staudenmeir 的 “eager load limit” 包背后的代码集成到了 Laravel 11 中。
— Taylor Otwell (@taylorotwell) 2024 年 1 月 16 日
这意味着在 Laravel 11 中,以下代码将正常工作……检索用户,同时为每个用户预加载最多 5 个帖子……❤️
感谢 @staudenmeir! pic.twitter.com/4IAbefwVJP
例如,假设你想对用户进行分页,同时为每个用户预加载 3 个博客帖子
User::with([ 'posts' => fn ($query) => $query->limit(3)])->paginate();
在默认情况下,上面的 Eloquent 查询将返回类似于以下 JSON 结构的结果,包含优化的预加载模型
在 Laravel 10 或更低版本中,你仍然可以通过 Jonas Staudenmeir 的 eager-load-limit 包来实现这个功能,但在 Laravel 11 中,它将原生支持。以下示例展示了你在 Laravel 11 中可以使用哪些查询来实现上述代码的功能
select count(*) as aggregate from `users`select * from `users` limit 15 offset 0select * from ( select *, row_number() over (partition by `posts`.`user_id`) as `laravel_row` from `posts` where `posts`.`user_id` in (1, 2, 3...))as `laravel_table` where `laravel_row` <= 3order by `laravel_row`
Laravel 11 的集成是在 Pull Request #49695 中完成的。我们要感谢 Jonas 将这个常用包集成到 Laravel 的核心代码中!