我的架构如下:
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 |
首先,您需要有 Course
、Document
和 Video
三个模型。然后您需要将多态关系添加到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/