2017-11-08 23 views
0

Laravelリレーションで複数のクラスに対して1つのテーブルを使用しようとしています。
つまり、私はユーザーを持っており、ユーザーはスキルを持つことができます。
スキルの唯一の違いは、それらのロジックが異なるため、異なるクラスとして定義されていることです。
私はそれらが論理に存在しなければならないので特別なテーブルを追加しません。
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

部分的な解決策は、抽象として親クラス(スキル)を定義してからnewFromBuilderメソッドを上書きしないことですモデル。誰かがもっと良い解決策を持っているなら、私はまだ見ています。

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

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

    return $instance; 
} 
関連する問題