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
父级。
修改
除非有人提供更好的解决方案,否则我使用ContentEntity
s。
答案 0 :(得分:1)
您可以随时将关系提取到特征,以便将来更容易维护和扩展:
<强>性状强>
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';
}