Laravel 的 API 资源功能 whenLoaded() 可以有条件地在 API 响应中包含关系数据,通过防止不必要的数据库查询来优化性能。
下面是使用
whenLoaded()
方法:
命名空间
App\Http\Resources
;使用
Illuminate\Http\Resources\Json\JsonResource
;班级
用户资源
延伸
Json资源{
民众
功能
数组
(请求){
返回
[
'ID'
=>
$this
->
ID,
'姓名'
=>
$this
->
姓名,
'帖子'
=>
帖子资源
::
收藏
(
$this
->
加载时
(
'帖子'
))];}}
如果“posts”关系尚未加载,posts 键将从响应中删除,只留下“id”和“name”。
以下是在现实世界中如何运作的一个例子:
命名空间
App\Http\Controllers
;使用
应用程序\模型\文章
;使用
App\Http\Resources\ArticleResource
;使用
照亮\Http\请求
;班级
文章控制器
延伸
控制器{
民众
功能
指数
(
要求
$请求){$查询
=
文章
::
询问
();
如果
请求
->
布尔值
(
'with_author'
)){$查询
->
和
(
'作者'
(英文):}
如果
请求
->
布尔值
(
'带注释'
)){$查询
->
和
([
'评论'
=>
fn
($查询) => $查询
->
最新的
()]);}
返回
文章资源
::
收藏
(查询)
->
分页
());}}班级
文章资源
延伸
Json资源{
民众
功能
数组
(请求){
返回
[
'ID'
=>
$this
->
ID,
'标题'
=>
$this
->
标题,
'内容'
=>
$this
->
内容,
'作者'
=>
新的
用户资源
(
$this
->
加载时
(
'作者'
)),
'评论'
=>
评论资源
::
收藏
(
$this
->
加载时
(
'评论'
)),
'latest_comment'
=>
$this
->
加载时
(
'评论'
,
功能
(){
返回
新的
评论资源
(
$this
->
评论
->
第一的
());})];}}
此实现通过以下方式演示了高效的关系处理:
- 根据请求参数动态关系加载
- 嵌套资源的条件包含
- 优化查询加载以获得更好的性能
使用
whenLoaded()
有助于创建精益、高效的 API,以优化数据库查询,同时保持在需要时包含相关数据的灵活性。







