如何用其他多对多关系模型的技能/水平来扩展用户模型?

时间:2019-03-25 16:33:22

标签: php laravel laravel-5 eloquent

我正在尝试扩展具有相关技能和水平的用户模型。所有用户将针对各种技能拥有不同的技能级别。我试图找出建立关系的最有效方法来实现这一目标。

我目前将“技能等级”设置为多对多关系。使用Skills_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)

在技能模型中:(使users_id可用:未使用)

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

最终,我希望用户模型返回所有​​相关用户技能及其级别的技能/级别阵列:技能名称,技能顺序,级别名称和级别值。

我目前的工作可行,但我认为可以做得更好。

为用户模型建立关系以连接技能名称和相关级别值的最佳方法是什么?

是否可以将技能/水平直接与用户模型相关联?因此,我只需要使用用户模型来访问所有相关的技能和水平。

还是我的人际关系错了?可以将模型更改为此关系:

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

谢谢。

2 个答案:

答案 0 :(得分:0)

在表skills_has_levels上要做的更改很少

您应该更改

skills_idshareable_skills_id

levels_idshareable_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');
    }
}

我希望这能使您恢复用户的技能

答案 1 :(得分:0)

您的数据库使我的工作更加艰辛 如果要在用户模型中使用动态属性,可以使用动态属性

模型用户<--(很多)->级别<--(很多)

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
}