首页 > 解决方案 > 使用 Laravel 从资源中的数据透视表中查找相关表的值很热门

问题描述

我想从代表数据透视表的资源中检索用户的名称和任务的名称,即task_user. 但是我想使用 Laravel 的资源来做到这一点。

这是TaskUserResource中的代码:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'task_id' => $this->task_id,
        'user_id' => $this->user_id,
        'task_name' => Task::where('id', $this->task_id)->pluck('name')->first(), //to edit
        'user_name' => User::where('id', $this->user_id)->pluck('name')->first(), //to edit
    ];
}

代码正常工作。顺便说一句,我问自己这是否是一种做得更好的方法,因为我认为用表的每个返回行雄辩地进行两次查询是很昂贵的task_user。表userstasks有一个多对多的关系。

用户.php

public function tasks()
{
    return $this->belongsToMany('App\Task')->withTimestamps();
}

任务.php

public function users()
{
    return $this->belongsToMany('App\User')->withTimestamps();
}

这是我的控制器:

class HomeController extends Controller
{
    public function index()
    {
        $projects = Project::all();

        $tasks = Task::all();

        $tasks_users = TaskUserResource::collection(TaskUser::all()); //this is the query

        $users = UserResource::collection(User::all()); 

        return view('home')->with(['task_user'=>json_encode($tasks_users), 'tasks'=>$tasks, 'projects'=>$projects, 'users'=>json_encode($users)]);
    }
}

可以帮忙?

标签: laravel

解决方案


确保您在 TaskUser 数据透视模型中有user()和关系。task() belongsTo()

任务用户:

public function task()
{
    return $this->belongsTo('App\Task');
}

public function user()
{
    return $this->belongsTo('App\User');
}

使用with()方法加载此关系时。

控制器:

$tasks_users = TaskUser::with(['user', 'task'])->get();
$tasks_users = TaskUserResource::collection(tasks_users);

然后替换资源中的代码。

任务用户资源:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'task_id' => $this->task_id,
        'user_id' => $this->user_id,
        'task_name' => $this->task->name,
        'user_name' => $this->user->name,
    ];
}

推荐阅读