我正在使用 Laravel 10(计划很快切换到 11)来公开 API。以下是我遇到的问题的简化版本。
我有一个包含用户的表和一个包含组的表,它们之间有多对多的关系。数据透视表有一列created_at,基本上可以归结为用户加入组的那一刻。当通过 API 检索用户时,我将使用数据透视来获取相关组。这会产生如下所示的 JSON(省略不相关的部分)
{
'groups':[
{
'name': 'group A',
'pivot': {
'created_at': '2024-...'
}
},
...
]
}
但是,我更喜欢这样的输出:
{
'groups':[
{
'name': 'group A',
'joined': '2024-...'
},
...
]
}
实现这一目标的最佳方法是什么?我可以完全手工制作 JSON,但是我会损失很多。还有其他端点会在用户上下文之外公开组,这些端点不应受到影响。
通常,要修改 JSON,您可以创建资源
php artisan make:resource UserResource
在
UserResource
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'groups' => $this->groups->map(function ($group) {
return [
'name' => $group->name,
'joined' => $group->pivot->created_at
];
})
];
}
在控制器中
public function show($id) # in your method
{
$user = User::with('groups')->findOrFail($id);
return new UserResource($user); # call the UserResource
}