Как визуализировать данные из другой таблицы в hasMany отношения Laravel? - PullRequest
0 голосов
/ 03 мая 2019

На сайте вакансий У меня есть таблица с пользователями, кандидатами, навыками и навыками.У пользователя есть много кандидатских навыков.Каждый Кандидат_скилл принадлежит пользователю, а также навыку.

В таблице андидат_скиз есть следующие столбцы:

id
user_id 
skill_id
years_xp
comfort_level
created_at
updated_at

В таблице skill есть

id
name
...

Каждый пользовательможно выбрать навык из таблицы навыков.Эта запись добавляется в качестве кандидата-навыка.

Я отображаю список пользователей, и я хотел бы показать навыки, которыми обладает каждый кандидат.В моей пользовательской модели у меня есть метод для захвата кандидата-навыка пользователя:

public function skills()
{
   return $this->hasMany('App\CandidateSkill');
}

Как мне заполнить этот список именами навыков из таблицы навыков?

Прямо сейчас я 'm получает результаты, например:

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

Как я могу включить название навыка при рендерингеree__skills для пользователя?

Например, навык с идентификатором 64 имеет имя «PHP».При отображении пользователя 43 я хотел бы перечислить его навык с именем «PHP» вместо 64.

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Модель пользователя

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

У меня нет демо-данных для тестирования, но я думаю, что он будет работать нормально.

0 голосов
/ 03 мая 2019

Многим-многим отношениям в laravel необходимо, чтобы обе модели имели belongsToMany. По умолчанию laravel будет искать таблицу candidate_skills и ожидать столбцы 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  
    }
}
...