Stu*_*urm 8 php inheritance laravel laravel-5
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
Run Code Online (Sandbox Code Playgroud)
内容类不一定是本文所知的,因此定义具有许多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');
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但对我来说似乎非常不洁净.我认为它必须增加太多的开发人员开销才能管理ContentEntity父级.
编辑:
除非有人提供更好的解决方案,否则我选择了使用ContentEntitys 的EAV风格解决方案.
您始终可以提取与特征的关系,以便将来更容易维护和扩展:
特征
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
}
Run Code Online (Sandbox Code Playgroud)
然后您需要做的就是在各种实体中使用该特征:
楷模
class Content extends Model {
use Contentable;
}
class Video extends Model {
use Contentable;
}
class Article extends Model {
use Contentable;
protected $contentable = 'many';
}
Run Code Online (Sandbox Code Playgroud)