假设我们有以下模型:一个Warrior
、一个Axe
和一个Sword
有没有办法使以下行为成为可能?
$warrior->weapon = $sword;
// ...
或
$warrior->weapon = $axe;
// ...
换句话说,是否可以将单独的模型视为具有相似类型的 Eloquent?
附注
显然,上面是一个问题的简化示例,仅用于传达其要点。
最佳答案
是的,你可以将武器
制作为polymorphic relation 。将 weapon_type
和 weapon_id
列添加到您的表中,这可以在具有 morphs
类型的迁移文件中完成:
Schema::table('warriors', function ($table) {
$table->morphs('weapon');
});
现在您已准备好将您的关系添加到 Warrior
模型中:
public function weapon() {
return $this->morphTo();
}
就是这样!现在您可以添加武器,Eloquent 将处理剩下的事情。该关系甚至支持急切加载。我建议你所有的武器都应该实现一个接口(interface),这样你就知道它们有哪些共同的方法,但不幸的是,Eloquent 无法通过 PHP 类型系统为你强制执行该接口(interface)。
关于laravel - Laravel 5 中的反向多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065320/