2016-01-06 7 views
7

Laravelでの多型関係の通常の使用は、Post-User-Imageの例でかなりうまくカバーされます。インターフェイスを使用するときの関係を定義する方法

Article/ContentA/ContentBの関係を言うと、関係を実装するためのきれいな方法を見つけようとしています。

articles 
    id 

content_1 
    id 

content_2 
    id 

user_defined_content_n 
    id 

contentables 
    article_id 
    contentable_id 
    contentable_type // content_2, user_defined_content_n 

コンテンツクラスは、必ずしもそう多くMorphedByMany関係で記事のモデルを定義し、記事で知られていないが、私はこれをしたいかではありません。

おそらく私はクラスをうまく構成していません。可能であれば、ContentクラスにモーフするContentEntityクラスを作成することができますが、これを避けたいと考えています。


おそらくこれが私の問題をよりよく説明します。

class Article extends Model { 
    public function contentEntities() { 
     return $this->hasMany(ContentEntity::class); 
    } 
} 

class ContentEntity extends Model { 
    public function contentable() { 
     return $this->morphTo(); 
    } 
} 

class Content extends Model { 
    public function contentEntity() { 
     return $this->morphOne(ContentEntity::class, 'contentable'); 
    } 
} 

class Video extends Model { 
    public function contentEntity() { 
     $this->morphOne(ContentEntity::class, 'contentable'); 
    } 
} 

これは機能しますが、私にとっては非常に汚れているようです。私はそれがContentEntityの親を管理するためにあまりにも多くの開発者のオーバーヘッドを追加すると思う。

編集: 誰かがよりよい解決策を提供しない限り、私はContentEntity Sを使用してEAVスタイル溶液で行きました。

+0

あなたの 'article'、' contentA'と 'contentB'を投稿してください。 –

+1

@MohamedKawsara私が追加したテーブルが私の質問を明確にするのに役立つと思います。 – Sturm

+1

私はそれがプログラマ交換に移動したとフラグを立てましたので、それは少し話題ですから – Sturm

答えて

0

あなたは常に将来的にメンテナンスを容易にし、拡張性のための特性との関係を抽出することができます:

形質

trait Contentable 
{ 
    public function contentEntity() { 
     if(property_exists($this, 'contentable') && $contentable == 'many') { 
      return $this->hasMany(ContentEntity::class); 
     } else { 
      return $this->morphOne(ContentEntity::class, 'contentable'); 
     } 
    } 

    // Future implementations 
} 

次にあなたがする必要があるすべては、様々な主体で形質を使用しています:

モデル

class Content extends Model { 
    use Contentable; 
} 

class Video extends Model { 
    use Contentable; 
} 

class Article extends Model { 
    use Contentable; 

    protected $contentable = 'many'; 
} 
関連する問題