Post – User –
Image示例很好地涵盖了Laravel中多态关系的正常使用.
我试图找到一种干净的方式来实现关系,让我们说一个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关系的文章模型不是我想要这样做的方式.
也许我正在很好地构建我的课程.我可以创建一个ContentEntity类,它变换为单个Content类,但我想尽可能避免这种情况.
也许这更能解释我的问题.
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父级.
您总是可以将关系提取到特征,以便将来更容易维护和扩展:
特征
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'; }