2015-11-19 77 views
2

我的架構如下:雄辯ORM附帶條件的關係

courses 
-id 
-title 
-... 

documents 
-id 
-... 

videos 
-id 
-path 
-... 

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

每門課程資源可以是多種類型的,在這種情況下,文件或視頻。如何根據類型列中的course_resources數據透視表來檢索文檔或視頻中的關係?很明顯,resource_id可以取值爲video_iddocument_id

理想我想是這樣的:

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

回答

2

您應該使用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) { 
    // ... 
} 
+0

感謝或「鬥Ø貝雷!「:) :) –

+0

Buna traducerea :))。 Cu placere。 – Bogdan