使用枢轴模型数据作为与Laravel 4的Eloquent中另一个模型的关系

时间:2013-06-28 14:44:54

标签: php laravel laravel-4 eloquent

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

在我的应用程序中,我有一个User,可以有多个Subjects和多个Semesters。当用户拥有Subject时,它也需要属于给定的Semester。我有一个userssubjectssemesters表,以及一个subject_user表(包含user_idsubject_id和{{1} }})。

当我检索semester_id的主题时,我还希望能够通过数据透视表获取User已连接的Session

Subject

我希望能够做到以下几点,并且可以使用class User { public function subjects() { $this->belongsToMany('Subject')->withPivot('session_id'); } } 模型。

Session

这样的事情是否可能,或者这需要延伸到Eloquent?

1 个答案:

答案 0 :(得分:0)

有一种方法可以通过创建扩展Illuminate\Database\Eloquent\Relations\Pivot的类来实现。虽然这种方法还需要为拥有此数据透视表的两个模型添加一些代码,以便在需要时使用新的数据透视表。

此链接讨论了Custom 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 Doc参考:Working with Pivot Tables有一个关于定义自定义枢轴模型的简短段落。