Laravel中多态关系的正常使用在后用户图像示例中得到了很好的介绍。
我正试图找到一种简洁的方法来实现关系,比如文章/内容/内容B关系。
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
父级。
编辑:,除非有人提供更好的解决方案,否则我使用ContentEntity
的EAV风格的解决方案。
发布于 2016-05-02 10:09:56
为了将来更容易维护和扩展,您总是可以提取出与某一特性的关系:
性状
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';
}
https://stackoverflow.com/questions/34643629
复制相似问题