Using pivot model data as a relationship to another model in


Using pivot model data as a relationship to another model in Laravel 4's Eloquent

我有一个多对多关系的透视表,其中包括另一个模型的第三个索引参数。我希望能够使用Eloquent访问此模型。

在我的应用程序中,我有一个User,他可以有许多Subjects和许多Semesters。当用户具有Subject时,它也需要属于给定的Semester。我有一个userssubjectssemesters表,还有一个subject_user表(它有user_idsubject_idsemester_id)。

当我检索User的主题时,我还希望能够通过透视表获得Subject连接到的Session

class User
{
    public function subjects()
    {
        $this->belongsToMany('Subject')->withPivot('session_id');
    }
}

我想做的事情如下,并有Session型号可供我使用。

$user->subjects()->pivot->semester;

这样的事情可能吗,或者这需要扩展到Eloquent吗?

有一种方法可以通过创建一个扩展Illuminate'Database'Eloquent'Relations'Pivot的类来实现这一点。尽管这种方法还需要向拥有此pivot的两个模型添加一些代码,以便在需要时使用新的pivot。

此链接讨论自定义数据透视模型的实现:https://github.com/laravel/framework/issues/2093#issuecomment-39154456

use Illuminate'Database'Eloquent'Relations'Pivot;
class SubjectUser extends Pivot {
   // add your relationships back to User and Subject
    public function session() {
         // your relation to session here
    }
}
class Subject extends Eloquent {
    ...
    public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
        if ($parent instanceof User) {
            return new SubjectUser($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}
class User extends Eloquent {
    ...
    public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
        if ($parent instanceof Subject) {
            return new SubjectUser($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

现在,您将可以访问已定义的数据透视的关系。

$user->subjects->first()->pivot->session->...

注意:您将不会直接与此类交互。当这两个模型之间需要枢轴时,将创建它而不是默认的枢轴。

Laravel文档参考:使用数据透视表有一篇关于定义自定义数据透视模型的短文。