我有可用的现有数据:我有一个表格,其中包含所有名为sportevents
.
id ....
name ....
....
这些体育赛事有一个数据透视表,用于定义与前一年和明年发生的“相同”体育赛事的关系。有点令人困惑的设计,但这里有一个叫做 eventrelations 的表:我试着用 2018 年和 2019 年来解释
id ....
event1: sportevent_id of 2019 event
event2: sportevent_id or 2018 event
....
我的方法是创建一个Eventrelation
具有以下关系的模型:
public function previous(){
return $this->belongsTo('App\Sportevent','event1','id' );
}
public function next(){
return $this->belongsTo('App\Sportevent','event2','id' );
}
在我的Sportevent
模型中,我将执行以下操作:
public function previousEvent(){
return $this->hasOne('App\Eventrelation','event2','id' );
}
public function nextEvent(){
return $this->hasOne('App\Eventrelation','event1','id');
}
虽然这会奏效,但我认为这不是正确的方法。我已经用数据透视表设置了其他关系,但考虑到现有的数据结构和与同一模型的关系,这个关系似乎有点棘手。任何建议将不胜感激。
更新
我按照我上面建议的方式让它工作,我宁愿拥有一个更干净的版本的原因是减少代码(这是更干净的一部分:-))。所以这里是我如何称呼这些关系以及我更愿意如何称呼它们:
$previousEvent = $thisEvent->previousEvent ? $thisEvent->previousEvent->previous : null;
$nextEvent = $thisEvent->nextEvent ? $thisEvent->nextEvent->next : null;
// Better would be:
$previousEvent = $thisEvent->previousEvent;
$nextEvent = $thisEvent->nextEvent;
您根本不需要枢轴模型。您可以与类本身建立关系。
在您的体育赛事模型中:
public function previousEvent()
{
return $this->belongsToMany(SportsEvent::class, 'pivot_table_name', 'event_1', 'id');
}
public function nextEvent()
{
return $this->belongsToMany(SportsEvent::class, 'pivot_table_name', 'event_2', 'id');
}
如果只有一个事件,您可以->first()
在关系的末尾添加一个术语。
但是,您也可以简单地添加两列 2018_event 和 2019_event 并在那里添加事件的 id,然后使用 hasOne 关系。你的来电
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句