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

时间:2017-08-30 11:11:26

标签: php laravel laravel-5 eloquent

我想知道你如何解决我将要展示不同类型事件的问题。例如,2个不同的事件可以是足球事件和公式1事件。

在这两种情景中,有不同类型的参与者。在一场足球比赛中,这将是两支球队,而在一个formular1比赛中,它将成为所有车手。

以下是我想要做的雄辩示例:

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;
}

但是当尝试这个并尝试加载它时,我得到了错误"调用未定义的方法Illuminate \ Database \ Query \ Builder :: addEagerConstraints()"。

我认为我需要朝着正确的方向努力。

提前致谢。

2 个答案:

答案 0 :(得分:2)

正确的方法是使用Many To Many Polymorphic Relations
例如
步骤1)使用以下结构创建数据透视表eventables 注意:将event_id和eventable_id的数据类型更改为相应表格的主键

eventables
    event_id - integer  
    eventable_id - integer
    eventable_type - string

步骤2)Event()方法添加到EventTeam和EventDriver模型

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');
}

现在,您可以在不同的事件

上检索不同的模型

答案 1 :(得分: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;将返回Model类的实例,并且期望关系返回HasOne,HasMany,BelongsToMany等类型的实例。

要解决此问题,回退关系必须包含任何这些类的实例。