假设我们有以下模型:Warrior
,Axe
和Sword
有没有办法让以下行为成为可能?
$warrior->weapon = $sword;
// ...
或
$warrior->weapon = $axe;
// ...
换句话说,是否可以将单独的模型视为具有与Eloquent相似的类型?
P.S
显然,上面是一个问题的简化示例,仅用于传达其要点。
答案 0 :(得分:0)
是的,您可以将weapon
设为polymorphic relation。将列weapon_type
和weapon_id
添加到您的表中,可以在morphs
类型的迁移文件中完成:
Schema::table('warriors', function ($table) {
$table->morphs('weapon');
});
现在您已准备好将您的关系添加到Warrior
模型:
public function weapon() {
return $this->morphTo();
}
那就是它!现在你可以添加武器,Eloquent会照顾其余的。该关系甚至支持急切加载。我建议你所有的武器应该实现一个接口,这样你才能知道它们有什么共同的方法,但不幸的是,Eloquent没有办法通过PHP类型系统为你强制执行该接口。