假设我有3个表,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' |
--------------------------------------
在Matches
:
---------------------------
| 1 | 'Team 1' | 'Team 2' |
---------------------------
我的Event Model
:
public function eventable() {
return $this->morphTo();
}
我的Match/Training Model
:
public function events() {
return $this->morphMany('App\Event', 'eventable');
}
但是,如果我想要更新该活动并且我想将其从Match
更改为Training
但保留该活动该怎么办。
是否有更有说服力的方式或我必须这样做?
$event->eventable->delete();
$training = Training::create(['type' => 'Stamina Training']);
$event->update([
'name' => $request->name,
'eventable_id' => $training->id,
'eventable_type' => 'App\Training'
]);
答案 0 :(得分:0)
我进入这个问题遵循相同的惯例40388570这不是一个Laravel方式,但它可以追踪
答案 1 :(得分:0)
好的,我也遇到了同样的问题,解决方案是在关系上使用关联函数。您可以简单地将另一个模型实例关联到变形关系,而不是删除“事件”上的“事件”。如下所示。
$training = Training::create(['type' => 'Stamina Training']);
$event->eventable()->associate($training);
$event->update([
'name' => $request->name
]);