Laravel 5中的反向多态关系

时间:2016-10-15 23:36:57

标签: laravel laravel-5 eloquent relationship

假设我们有以下模型:WarriorAxeSword

有没有办法让以下行为成为可能?

$warrior->weapon = $sword;
// ...

$warrior->weapon = $axe;
// ...

换句话说,是否可以将单独的模型视为具有与Eloquent相似的类型

P.S

显然,上面是一个问题的简化示例,仅用于传达其要点。

1 个答案:

答案 0 :(得分:0)

是的,您可以将weapon设为polymorphic relation。将列weapon_typeweapon_id添加到您的表中,可以在morphs类型的迁移文件中完成:

Schema::table('warriors', function ($table) {
    $table->morphs('weapon');
});

现在您已准备好将您的关系添加到Warrior模型:

public function weapon() {
    return $this->morphTo();
}

那就是它!现在你可以添加武器,Eloquent会照顾其余的。该关系甚至支持急切加载。我建议你所有的武器应该实现一个接口,这样你才能知道它们有什么共同的方法,但不幸的是,Eloquent没有办法通过PHP类型系统为你强制执行该接口。