Laravel 4多对多三角形与Eloquent,检索“建议”类似的数据

时间:2015-02-19 15:52:34

标签: php database laravel laravel-4 eloquent

这可能非常简单,但我无法找到解决方案......任何帮助都将受到赞赏。 我有3个表:用户技能项目,所有这些表都以多对多关系相互连接。

用户< - MtM - >技能< - MtM - >项目< - MtM - >用户

用户模型

public function skills()
{
    return $this->belongsToMany('Skill')->withPivot('level');
}
public function projects(){

    return $this->belongsToMany('Project')->withPivot('user_id', 'project_id');
}

技能模型

public function users() {
    return $this->belongsToMany('User')->withPivot('level');
}
public function projects() {
    return $this->belongsToMany('Project')->withPivot('level');
}

项目模型

public function users(){
    return $this->belongsToMany('User')->withPivot('user_id', 'project_id');
}
public function skills(){
    return $this->belongsToMany('Skill')->withPivot('level');
}

所以,一个多对多的三角形。我想获得所有项目,其技能是 子集 的特定用户技能。所以基本上"建议项目"对于用户。

$projects = Project::whereHas('skills', function($q) use($array)
    {
        $q->thatAreSubsetOf($array);
        //$array contains names or ids of users skills
    })->orderBy('created_at', 'DESC')->get();

如果某些$user->skills是' PHP',' C'并且' Javascript',所有返回的项目技能应成为其中的一部分(例如 {' PHP',' C&#39 ;}或{' PHP',' Javascript'}或{' Javascript',' C'}或{' PHP&# 39;,' C',' Javascript'}或{' PHP'},或{' Javascript'}或{' C'} )  我尝试了很多东西,在Laravel Docs /这里研究了很多,但似乎无法得到我想要的东西..

1 个答案:

答案 0 :(得分:0)

基本上您的要求可以达到Many To Many Polymorphic Relations。您的要求是使用User和Project的技能,因此使用MTMPR可以很容易地处理它。

下面的示例显示了我如何使用项目和用户实现共享技能。

数据库架构

技能

id              integer
name            string

skillable

id              integer
skillable_id    integer
skillable_type  string 

<强>模型

技能

class Skill extends Eloquent{
        public function projects(){
            return $this->morphedByMany('Project', 'skillable');
        }

        public function users(){
            return $this->morphedByMany('User', 'skillable');
        }
}

项目

class Project extends Eloquent{
        public function skills(){
            return $this->morphToMany('Skill', 'skillable');
        }
}

用户

class User extends Eloquent{
    public function skills(){
        return $this->morphToMany('Skill', 'skillable');
    }
}

如何从项目获得技能

$project = Project::find($id);
$projectsSkill = $project->skills()->all();

如何从技能中获得项目

$skill = Skill::find(1);
$projects = $skill->projects();

如果你仍然发现不清楚处理这些情况的事情,请告诉我。