laravel - 如何在 Laravel 资源中检索具有多对多关系的数据
问题描述
我正在使用 Laravel 7。我有三个具有多对多关系的表。表users
是task_user
和tasks
。模型具有以下关系:
任务.php:
public function users()
{
return $this->belongsToMany('App\User')
->withPivot('user_id', 'task_id')
->withTimestamps();
}
任务用户.php:
public function task()
{
return $this->belongsTo('App\Task');
}
public function user()
{
return $this->belongsTo('App\User');
}
用户.php:
public function tasks()
{
return $this->belongsToMany('App\Task')
->withTimestamps();
}
这是我的控制器方法:
public function get_delayed_tasks() {
$tasks = Task::select('id', 'name', 'description', 'deadline', 'closed_at', 'status_id', 'project_id')
->whereRaw('closed_at > deadline')
->get();
return TaskResource::collection($tasks);
}
这是我的资源:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'deadline' => $this->deadline,
'closed_at' => $this->deadline,
'status' => $this->status->name,
'project' => $this->project->name,
'devs' => $this->relationLoaded('users')
? $this->users->pluck('users.name')->unique()->all()
: [], //problem
];
}
不幸的是,dev
我总是收到资源中的键[]
,即使我应该收到一个名称数组。如何检索所有使用过该任务的用户?
解决方案
您必须加载关系才能在资源中使用它
控制器
public function get_delayed_tasks() {
$tasks = Task::with(['users']) // <-- load relationship
->select('id', 'name', 'description', 'deadline', 'closed_at', 'status_id', 'project_id')
->whereRaw('closed_at > deadline')
->get();
return TaskResource::collection($tasks);
}
资源
'devs' => $this->whenLoaded(
'users',
$this->users->pluck('name')->unique()->all(),
[]
)
资源的高级修改,如果您决定创建一个UserResource
以获取更多数据:
'devs' => UserResource::collection($this->whenLoaded('users'))
推荐阅读
- visual-studio-code - cmd shell 中的 Ctrl+C 导致 VSCode 退出
- macos - 是否可以通过 Applescript 访问 Spotify Mac 应用程序中当前播放歌曲的歌曲名称?
- javascript - 如何通过 event.target 区分同一层中的 react konva 元素?
- c# - C# 不会运行 PowerShell 脚本
- c# - 为什么我的 Web API 没有响应我的请求?
- python - 在python中检查一个字符串是否至少包含五个字符
- java - 如何将 JPA 查询结果映射到 POJO?
- php - 将内联 CSS 添加到 woocommerce 产品列表
- asp.net-mvc - 修改 web.config 文件
- selenium - 硒网格。在各种浏览器中并行执行