Как расширить модель «Пользователи» с помощью множества моделей отношений «Навыки / Уровни»? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь расширить модель пользователя с соответствующими навыками и уровнями.Где все пользователи будут иметь разные уровни квалификации для различных навыков.Я пытаюсь найти наиболее эффективный способ установить отношения для достижения этой цели.

В настоящее время я устанавливаю уровень навыка «Уровень - как отношение многие ко многим».Пользователь для skill_has_levels - один ко многим, но в данный момент он не используется.

Существует множество навыков, которыми может обладать пользователь, и каждый навык может иметь разный уровень от отсутствия опыта до эксперта.

[Tables]

users
    id, username, email, pwd, token, timestamps

skills (ie. laravel, angular, bootstrap, etc)
    id, name, order

levels (ie. none, beginner, intermediate, expert)
    id, name, value

skills_has_levels
    id, skills_id, levels_id, users_id

У нас есть три модели:

1) User (has many skills with levels)
2) Skill (has many levels)
3) Level (has many skills)

В модели Skill: (чтобы идентификатор пользователя был доступен: не используется)

$this->belongsToMany('App\Level’)
        ->withPivot(‘users_id’);

Для просмотра списка всех пользователей, их навыков и уровней:

$users = User::all()->toArray();

foreach($users as $user)
{
    echo "User ID: ".$user->id;
    $skills = Skill::where(‘users_id’, ’=‘, $user->id)->get()->toArray();
    print_r($skills);
    echo "\n\n\n";
}

В конечном счете, я бы хотел, чтобы модель User возвращала массив навыков / уровней всех связанных пользовательских навыков и их уровней: имя навыка, порядок навыков, имя уровня и значение уровня.

То, что я сейчас делаю, работает, но я чувствую, что это можно сделать лучше.

Каков наилучший способ структурировать отношения для модели User для подключения к именам навыков и связанным значениям уровней?

Возможно ли связать навык / уровень напрямую с моделью пользователя?Поэтому мне нужно только использовать модель User для доступа ко всем связанным навыкам и уровням.

Или мои отношения неверны?Могли бы поменять модели на это отношение:

A User has many Skill
    Skill has many skill types
    Skill has many skill levels

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Ваша база данных делает работу тяжелее, я думаю Вы можете использовать динамические свойства, если хотите сделать их доступными в usermodel

Модели пользователя <- - (Многие ко многим) -> Уровни <- - (Многие ко многим) </p>

protected $appends = ['skills_levels'];

public function getSkillsLevelsAttribute()
{

    $skills = // query to get all skills ->pluck('skill','id');

    $this->load('levels.skills')
    $levels = $this->levels->groupBy('skills.skill_id')->toarray();
    $output = [];

    foreach ($skills as $id => $skill) {
        $output[$skill] = [];
        if (isset($levels[$id])) {
            $output[$skill] = $levels[$id] // all levels user have for this skill
        }
    }
    return $output
}
0 голосов
/ 25 марта 2019

Ну, есть несколько изменений, которые нужно сделать на столе skills_has_levels

вы должны изменить

skills_id до shareable_skills_id

levels_id до shareable_levels_id

и, наконец, обновите свои классы, как показано ниже

Class SkillsHasLevels
{
    public function shareable()
    {
        return $this->morphTo();
    }
}

Class Skill
{
    public function shares()
    {
        return $this->morphOne(SkillsHasLevels::class, 'shareable');
    }
}

Class User
{
    public function skills()
    {
        return $this->morphedByMany(Skill::class, 'shareable', 'shares');
    }
}

Я надеюсь, что это вернет вам навыки пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...