Php 雄辩的ORM条件模型关系

Php 雄辩的ORM条件模型关系,php,laravel,orm,eloquent,Php,Laravel,Orm,Eloquent,我的模式如下: courses -id -title -... documents -id -... videos -id -path -... course_resources -id -course_id -type [docs OR videos] -resource_id 每个课程资源可以有多种类型,在本例中为文档或视频。根据课程资源透视表中的类型列,应该如何编写关系以检索文档或视频?显然,资源id可以采用视频id或文档id的值 理想情况下,我想要这样的东

我的模式如下:

courses
 -id
 -title
 -...

documents
 -id
 -...

videos
 -id
 -path
 -...

course_resources
 -id
 -course_id
 -type [docs OR videos]
 -resource_id
每个课程资源可以有多种类型,在本例中为文档或视频。根据课程资源透视表中的类型列,应该如何编写关系以检索文档或视频?显然,资源id可以采用视频id文档id的值

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

$course=Course::with('resources')->find(1);
foreach($course->resources as $resource){
 //check resource type
 //do something
}
您应该使用来完成此任务。您的
course\u resources
表结构几乎正确,但是您需要将其替换为此表,以便Laravel能够理解关系并获取正确的资源:

| coursable        |
|------------------|
| course_id        |
| coursable_id     |
| coursable_type   |
首先,您需要为
课程
文档
视频
提供三种模型。然后,您需要将多态关系添加到
课程
模型中:

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) {
    // ...
}

谢谢或“Dau o bere!”:)布纳Traducera:))。铜砂矿。