Laravel更新多态关系

时间:2018-01-31 15:54:22

标签: laravel polymorphism

假设我有3个表,EventsMatchesTrainingEvents是一个多态表,可以是MatchTraining

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

2 个答案:

答案 0 :(得分:0)

我进入这个问题遵循相同的惯例40388570这不是一个Laravel方式,但它可以追踪

答案 1 :(得分:0)

好的,我也遇到了同样的问题,解决方案是在关系上使用关联函数。您可以简单地将另一个模型实例关联到变形关系,而不是删除“事件”上的“事件”。如下所示。

$training = Training::create(['type' => 'Stamina Training']);
$event->eventable()->associate($training);
$event->update([
    'name' => $request->name
]);