我尝试在Laravel关系中使用一个表用于多个类
因此,即我有一个用户,用户可以拥有技能。
技能之间的唯一区别是它们具有的逻辑,因此它们被定义为不同的类。
我想不为它们添加一个特殊的表,因为它们只需存在于逻辑中。
Laravel是否有办法让关系检查列以找到它的类?
这是所有者的代码,所以在这种情况下说是用户。
class User extends Authenticatable
{
public function skills()
{
return $this->morphMany(Skill::class, 'owner');
}
public function learnSkill($className)
{
$this->skills()->create(['type' => $className]);
}
}
这是我想要定义技能的抽象类。
abstract class Skill extends Model
{
}
这些是我想从关系中获得的类,因为它们可以有不同的逻辑。
class PHP extends Skill
{
}
class HTML extends Skill
{
}
目前的问题是我们要求Laravel实例化技能'什么当然是不可能的,因为它是抽象的,它应该是。
Laravel抛出异常"无法实例化抽象类App \ Skills \ Skill"。
\厂商\ laravel \框架\ SRC \照亮\数据库\锋\关注\ HasRelationships.php
/**
* Create a new model instance for a related model.
*
* @param string $class
* @return mixed
*/
protected function newRelatedInstance($class)
{
return tap(new $class, function ($instance) {
if (! $instance->getConnectionName()) {
$instance->setConnection($this->connection);
}
});
}
答案 0 :(得分:0)
部分解决方案是不将父类(Skill)定义为抽象,并从模型中覆盖newFromBuilder方法。如果有人有更好的解决方案,我还在寻找。
public function newFromBuilder($attributes = [], $connection = null)
{
$instance = new $attributes->type;
$instance->exists = true;
$instance->setRawAttributes((array) $attributes, true);
return $instance;
}