显式ORM条件模型关系


Eloquent ORM conditional model relationship

我的模式如下:

courses
 -id
 -title
 -...
documents
 -id
 -...
videos
 -id
 -path
 -...
course_resources
 -id
 -course_id
 -type [docs OR videos]
 -resource_id

每个课程资源可以是多种类型,在本例中是文档或视频。应该如何编写关系,以便根据course_resources数据透视表中的type列检索文档或视频?显然,resource_id可以取video_idocument_id的值。

理想情况下,我想要这样的东西:

$course=Course::with('resources')->find(1);
foreach($course->resources as $resource){
 //check resource type
 //do something
}

应该使用多对多多态关系来实现这一点。你的course_resources表结构几乎是正确的,但是你需要用这个表来替换它,这样Laravel就可以理解这种关系并获取正确的资源:

| coursable        |
|------------------|
| course_id        |
| coursable_id     |
| coursable_type   |

首先,您需要为CourseDocumentVideo提供三个模型。然后,您需要将多态关系添加到Course模型中:

class Course extends Model
{
    public function documents()
    {
        return $this->morphedByMany('App'Document', 'coursable');
    }
    public function videos()
    {
        return $this->morphedByMany('App'Video', 'coursable');
    }
}

现在您可以执行以下操作来访问资源,不需要更多的条件来区分它们:

// Eager load both relations
$course = Course::with('documents', 'videos')->find(1);
// Iterate over documents
foreach($course->documents as $document) {
    // ...
}
// Iterate over videos
foreach($course->videos as $video) {
    // ...
}