laravel - 使用 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
。表users
和tasks
有一个多对多的关系。
用户.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)]);
}
}
可以帮忙?
解决方案
确保您在 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,
];
}
推荐阅读
- command - 将目录和文件移动到父目录
- python - Groupby 客户的 id 并保留 Pandas 中不为空的日期
- java - 如何让java中的线程休眠几毫秒?
- php - PHP 检查数组中的特定值是否为真
- sql - 与 cte union all select
- amazon-web-services - 登录 AWS STS 登录
- pytorch - 如何从 CUDA 11.4 降级到 10.2 并添加 sm_35 - CUDA 错误:没有可在设备上执行的内核映像
- java - 如何删除给定 PDF 中的“TEST”,然后使用任何 Java 库保存它
- typescript - TS:断言对象的非空属性
- reactjs - Eslint 抱怨绝对进口