如何在hasMany关系Laravel中呈现来自不同表的数据?

时间:2019-05-03 20:41:16

标签: php laravel laravel-5 eloquent eloquent--relationship

我正在jobs site上为用户,候选人技能和技能提供一张桌子。一个用户有许多候选人技能。每个候选人技能既属于用户,也属于技能。

候选人技能表包含以下列:

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列出他们的技能。

2 个答案:

答案 0 :(得分:2)

用户模型

<?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_idwork_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

我没有用于测试的演示数据,但我想它可以正常工作。

答案 1 :(得分:0)

laravel中的许多关系都需要两个模型都具有belongsToMany。 默认情况下,laravel将查找candidate_skills表,并期望有candidate_idskill_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  
    }
}