假设我有三张表,Events
、Matches
和Training
。 Events
是一个多态表,它可以是Match
或Training
。
------------------ ----------- --------------
| Events | | Matches | | Trainings |
------------------ ---------- --------------
| id | | id | | id |
| name | | home | | type |
| eventable_id | | away | --------------
| eventable_type | -----------
------------------
现在,我创建了这样一个事件:
$match = Match::create(['home' => Team 1', 'away' => 'Team 2']);
$match->events()->create(['name' => 'Event name']);
因此,我的
Events
表中有这条记录:--------------------------------------
| 1 | 'Event name' | 1 | 'App\Match' |
--------------------------------------
在“匹配”中:
---------------------------
| 1 | 'Team 1' | 'Team 2' |
---------------------------
我的“事件模型”:
(注:该术语指IT技术中的一种编程模式,下同)
public function eventable() {
return $this->morphTo();
}
我的“匹配/训练模型”:
public function events() {
return $this->morphMany('App\Event', 'eventable');
}
然而,如果我想更新那个事件,并且我想把它从比赛
更改为训练
,但保留事件,该怎么办?
是否有更优雅的方法,还是我必须像这样做?
$event->eventable->delete();
$training = Training::create(['type' => 'Stamina Training']);
$event->update([
'name' => $request->name,
'eventable_id' => $training->id,
'eventable_type' => 'App\Training'
]);