Laravel 更新多态关系

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' |
--------------------------------------

在“匹配”中:
---------------------------
| 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'
]);
2个回答

3

好的,我也遇到了同样的问题,解决方法是在关系上使用associate函数。不要删除"event"上的"eventable",只需将另一个模型实例与morph关系相关联即可,如下所示。

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

0

我通过遵循相同的约定解决了这个问题,就像这个相关问题。虽然这不是 Laravel 的方式,但它可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接