如何在 hasMany 关系 Laravel 中呈现来自不同 table 的数据?
How to render data from a different table in hasMany relationship Laravel?
在 jobs site 上,我正在为用户提供 table,candidate_skills 和技能。一个用户有很多candidate_skills。每个candidate_skill属于一个用户,也属于一个技能。
candidate_skillstable有这些栏目:
id
user_id
skill_id
years_xp
comfort_level
created_at
updated_at
技能table有一个
id
name
...
每个用户都可以从技能table中挑选一个技能。该记录被添加为 candidate_skill.
我正在呈现一个用户列表,我想呈现每个候选人所拥有的技能。在我的用户模型上,我有一种方法可以获取用户的 candidate_skills:
public function skills()
{
return $this->hasMany('App\CandidateSkill');
}
如何使用技能 table 中的技能名称填充此列表?
现在我正在抓取如下结果:
$candidates = User::whereIn('department_id', $departmentFilters)
->whereIn('work_authorization', $workAuthFilters)
->orderBy('updated_at', 'desc')
->with('skills')
->get();
return response()->json($candidates);
这会加载 candidate_skills 的列表,但不包含该技能的可读名称。上面查询的结果给出 $candidate->skill
like:
{ "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" }
如何在为用户呈现 candidate_skills 时包含技能名称?
例如,ID 为 64 的 skill 的名称为 "PHP"。显示用户 43 时,我想用名称 "PHP" 而不是 64.
列出他们的技能
laravel 中的多对多关系需要两个模型都具有 belongsToMany
。
默认情况下 laravel 将查找 candidate_skills
table 并期望 candidate_id
和 skill_id
列。
https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
候选模型
function skills() {
return $this->belongsToMany(Skill::class);
}
技能模型
function candidates() {
return $this->belongsToMany(Candidate::class);
}
那么你应该能够抓取任何一个模型并获得相关数据。
$skills = Skills::with('candidates')->get();
foreach($skills as $skill) {
foreach($skill->candidate as $candidate) {
echo $skill->candidate
}
}
用户模型
<?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();
并在 blade
中显示
@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
我没有演示数据来测试它,但我想它可以正常工作。
在 jobs site 上,我正在为用户提供 table,candidate_skills 和技能。一个用户有很多candidate_skills。每个candidate_skill属于一个用户,也属于一个技能。
candidate_skillstable有这些栏目:
id
user_id
skill_id
years_xp
comfort_level
created_at
updated_at
技能table有一个
id
name
...
每个用户都可以从技能table中挑选一个技能。该记录被添加为 candidate_skill.
我正在呈现一个用户列表,我想呈现每个候选人所拥有的技能。在我的用户模型上,我有一种方法可以获取用户的 candidate_skills:
public function skills()
{
return $this->hasMany('App\CandidateSkill');
}
如何使用技能 table 中的技能名称填充此列表?
现在我正在抓取如下结果:
$candidates = User::whereIn('department_id', $departmentFilters)
->whereIn('work_authorization', $workAuthFilters)
->orderBy('updated_at', 'desc')
->with('skills')
->get();
return response()->json($candidates);
这会加载 candidate_skills 的列表,但不包含该技能的可读名称。上面查询的结果给出 $candidate->skill
like:
{ "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" }
如何在为用户呈现 candidate_skills 时包含技能名称?
例如,ID 为 64 的 skill 的名称为 "PHP"。显示用户 43 时,我想用名称 "PHP" 而不是 64.
列出他们的技能laravel 中的多对多关系需要两个模型都具有 belongsToMany
。
默认情况下 laravel 将查找 candidate_skills
table 并期望 candidate_id
和 skill_id
列。
https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
候选模型
function skills() {
return $this->belongsToMany(Skill::class);
}
技能模型
function candidates() {
return $this->belongsToMany(Candidate::class);
}
那么你应该能够抓取任何一个模型并获得相关数据。
$skills = Skills::with('candidates')->get();
foreach($skills as $skill) {
foreach($skill->candidate as $candidate) {
echo $skill->candidate
}
}
用户模型
<?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();
并在 blade
中显示@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
我没有演示数据来测试它,但我想它可以正常工作。