2017-08-30 134 views
1

我想知道如何解決我要顯示不同類型事件的問題。例如,2個不同的事件可以是足球事件和公式1事件。不同模型類型之間的不同關係Laravel

在這兩種情況下有不同類型的參與者。在一場足球比賽中,這將是兩支球隊,而在一場公式賽事中,這將是所有的車手。

這裏是我的,我想怎麼辦雄辯例如:

public function participants() 
{ 
    if ($this->type == 'soccer_game') { 
     return $this->hasMany(EventTeam::class); 
    } else if ($this->type == 'formula1_race') { 
     return $this->hasMany(EventDriver::class); 
    } 
    return $this; 
} 

但嘗試這一點,並嘗試時加載它,我得到錯誤「調用未定義的方法照亮\數據庫\查詢\生成器: :addEagerConstraints()」。

我想我需要一個正確的方向。

在此先感謝。

+0

您可以使用「許多檢索不同型號To Many Polymorphic Relations「,https://laravel.com/docs/5.4/eloquent-relationships#many-to-many-polymorphic-relations – jaysingkar

+0

@seifeddineBesbes只是好奇地想知道,它是如何與用戶的問題相關 – jaysingkar

回答

0
public function participants() 
{ 
    if ($this->type == 'soccer_game') { 
     return $this->hasMany(EventTeam::class); 
    } else if ($this->type == 'formula1_race') { 
     return $this->hasMany(EventDriver::class); 
    } 
    return $this; 
} 

在這種情況下return $this;將返回模型類的實例和關係有望重返HasOne,的hasMany,BelongsToMany等類型的實例。

要解決此問題,回退關係必須包含任何這些類的實例。

+0

是的,我明白。但是這絕不應該發生,因爲type屬性應該始終存在。自編輯抱怨之後,我剛剛添加了它。 –

+0

@JimmieJohansson你總是可以做一些像返回新的HasMany;模仿它,或者返回完全不同的課程。 –

1

正確的做法是使用Many To Many Polymorphic Relations

步驟1)具有以下結構
注創建透視表eventables EVENT_ID和eventable_id的數據類型更改爲各表的主鍵

eventables 
    event_id - integer 
    eventable_id - integer 
    eventable_type - string 

步驟2)Event()方法添加到您的EventTea m和事件驅動模型

public function events(){ 
    return $this->morphToMany(Event::class, 'eventable'); 
} 

步驟3)在事件模型定義的上述關係逆現在

public function eventDrivers() 
{ 
    return $this->morphedByMany(EventDriver::class, 'eventable'); 
} 

public function eventTeams() 
{ 
    return $this->morphedByMany(EventTeam::class, 'eventable'); 
} 

,你可以在不同的事件

+0

但是這意味着我需要爲事件 - > eventTeams爲足球比賽和Event-> eventDrivers爲公式1?我希望在參與者方法下使用它們,所以當使用「$ with = ['participants']」加載事件時,我總是可以加載參與者。 –