【问题标题】:Eloquent ORM conditional model relationshipEloquent ORM 条件模型关系
【发布时间】:2016-02-21 11:27:52
【问题描述】:

我的架构如下:

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_iddocument_id 的值。

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

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

【问题讨论】:

    标签: php laravel orm eloquent


    【解决方案1】:

    您应该使用Many-to-Many Polymorphic Relations 来完成此操作。您的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) {
        // ...
    }
    

    【讨论】:

    • 谢谢或“Dau o bere!” :)
    • Buna traducerea :))。铜矿。
    猜你喜欢
    • 2015-10-29
    • 2020-10-26
    • 2016-03-27
    • 1970-01-01
    • 2021-11-17
    • 2016-02-26
    • 2019-09-20
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多