不同模型类型之间的不同关系Laravel

问题描述:

我想知道如何解决我要显示不同类型事件的问题。例如,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

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;模仿它,或者返回完全不同的课程。 –

正确的做法是使用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']”加载事件时,我总是可以加载参与者。 –