php - 如何在hasMany关系Laravel中呈现来自不同表的数据?
问题描述
在我正在制作的工作网站上,我有一张用于用户、候选人技能和技能的表格。一个用户有很多候选技能。每个candidate_skill 属于一个用户,也属于一个技能。
Candidate_skills表有这些列:
id
user_id
skill_id
years_xp
comfort_level
created_at
updated_at
技能表有一个
id
name
...
每个用户都可以从技能表中选择一项技能。该记录被添加为候选技能。
我正在呈现一个用户列表,并且我想呈现每个候选人所拥有的技能。在我的用户模型上,我有一种方法来获取用户的候选技能:
public function skills()
{
return $this->hasMany('App\CandidateSkill');
}
如何使用技能表中的技能名称填充此列表?
现在我正在获取如下结果:
$candidates = User::whereIn('department_id', $departmentFilters)
->whereIn('work_authorization', $workAuthFilters)
->orderBy('updated_at', 'desc')
->with('skills')
->get();
return response()->json($candidates);
这会加载候选技能列表,但不包含该技能的可读名称。上述查询的结果$candidate->skill
如下:
{ "id": 22, "user_id": 43, "skill_id": 64, "years_xp": 2, "comfort_level": null, "created_at": "2019-04-15 18:51:14", "updated_at": "2019-04-15 18:51:14" }
在为用户呈现候选技能时,如何包含技能名称?
例如, ID 为 64 的技能的名称为“PHP”。当显示用户 43 时,我想用名称“PHP”而不是 64 列出他们的技能。
解决方案
用户模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\Skill;
class User extends Model
{
/**
* The skills that belong to the user.
*/
public function skills()
{
return $this->belongsToMany(Skill::class, 'candidate_skills', 'user_id', 'skill_id' )->withPivot('years_xp', 'comfort_level');
}
}
和技能模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\User;
class Skill extends Model
{
/**
* The users that belong to the user.
*/
public function users()
{
return $this->belongsToMany(User::class, 'candidate_skills', 'user_id', 'skill_id' )->withPivot('years_xp', 'comfort_level');
}
}
现在,让用户使用department_id
和work_authorization
过滤器
$candidates = User::whereIn('department_id', $departmentFilters)
->whereIn('work_authorization', $workAuthFilters)
->orderBy('updated_at', 'desc')
->with('skills')
->get();
并在刀片中显示时
@foreach($candidates as $candidate)
@foreach ( $candidate->skills as $skill )
{{ $skill->name }}
@endforeach
@endforeach
或者
@foreach($candidates as $candidate)
@foreach ( $candidate->skills as $skill )
{{ $skill->pivot->years_xp}}
{{ $skill->pivot->comfort_level}}
@endforeach
@endforeach
我没有演示数据来测试它,但我想它会正常工作。
推荐阅读
- node.js - lastmessageID 始终为空,除了我
- javascript - 如何在动态渲染中添加 html 标签并仍然加载值?
- python - 在 API 调用中优化 try-except
- gitlab - 获得 ssh 的权限被拒绝
- winforms - 大小 Windows 窗体 Powershell
- python - 用另一个数组替换 np 数组中的值
- c++ - 我可以推导出这些模板参数吗?
- javascript - 当我使用我的代码创建 PAdES LT 签名时,Adobe 显示 PKCS7 解析错误
- javascript - 升级后 VS 代码 JavaScript 错误语法荧光笔不起作用
- amazon-web-services - 如何链接 AWS Lambda 事件以重试给定调用?