php - Eloquent ORM 条件模型关系

标签 php laravel orm eloquent

我的架构如下:

courses
 -id
 -title
 -...

documents
 -id
 -...

videos
 -id
 -path
 -...

course_resources
 -id
 -course_id
 -type [docs OR videos]
 -resource_id

每个类(class)资源可以有多种类型,在本例中为文档或视频。应如何编写关系,以便根据 course_resources 数据透视表中的 type 列检索文档或视频?显然,resource_id 可以采用video_id 的值或document_id 的值。

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

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

最佳答案

您应该使用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) {
    // ...
}

关于php - Eloquent ORM 条件模型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33801895/

相关文章:

php - 使用 PHP 对数组进行排序以生成多级菜单列表

php - � 使用带有 strip_tags() 和 utf-8 字符集的 character_limiter() 出现

Laravel Livewire : Input select, 选择默认选项

php - 模型未链接到laravel php中的表格

php - SQLSTATE[HY000] [2003] 无法连接到 MySQL 服务器,出现 '127.0.0.1' (61) 错误 Laravel 4.1

php - preg_match 两边几个特殊字符之间的字符串

php - Cakephp搜索不存在的表条目的条件

php - 我们可以使用 odbc_connect 通过任何可用的 ORM 为 laravel 应用程序获取数据吗

xml - JPA 对 XML 数据类型列的支持

javascript - 我应该在模型或 Controller 中的什么地方编写查询(sequelize)?