【问题标题】:How to render data from a different table in hasMany relationship Laravel?如何在hasMany关系Laravel中呈现来自不同表的数据?
【发布时间】:2019-09-22 09:58:42
【问题描述】:

jobs site 上,我正在为用户、candidate_skills 和 Skills 创建一个表格。一个用户有很多候选技能。每个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->skilllike:

{ "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 的 skill 的名称为“PHP”。当显示用户 43 时,我想用名称“PHP”而不是 64 列出他们的技能。

【问题讨论】:

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


    【解决方案1】:

    用户模型

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

    我没有演示数据来测试它,但我想它会正常工作的。

    【讨论】:

    • 太棒了,我以前没有使用过数据透视表。效果很好!谢谢
    • @ConnorLeech 很高兴能为您提供帮助。
    【解决方案2】:

    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  
        }
    }
    

    【讨论】:

    • 当我尝试得到错误Column not found: 1054 Unknown column 'skills.user_id'。技能表没有用户 ID 列。我在 Candidate_skills 表上有 user_id
    • 您需要访问数据透视表,$skill-&gt;pivot-&gt;user_id$skill-&gt;user-&gt;id
    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2019-06-02
    • 2016-09-23
    • 2019-02-04
    • 2018-12-11
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多