Laravel关系的动态类实例

时间:2017-11-08 10:18:22

标签: php laravel laravel-5

我尝试在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);
            }
        });
    }


1 个答案:

答案 0 :(得分:0)

部分解决方案是不将父类(Skill)定义为抽象,并从模型中覆盖newFromBuilder方法。如果有人有更好的解决方案,我还在寻找。

public function newFromBuilder($attributes = [], $connection = null)
{
    $instance = new $attributes->type;

    $instance->exists = true;
    $instance->setRawAttributes((array) $attributes, true);

    return $instance;
}