首页 > 解决方案 > 如何在 Laravel 资源中检索具有多对多关系的数据

问题描述

我正在使用 Laravel 7。我有三个具有多对多关系的表。表userstask_usertasks。模型具有以下关系:

任务.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我总是收到资源中的键[],即使我应该收到一个名称数组。如何检索所有使用过该任务的用户?

标签: laravel

解决方案


您必须加载关系才能在资源中使用它

控制器

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'))

推荐阅读