我开始为两种语言(de,en)开发一个小的内容管理系统,这个系统开始变得越来越大。
在这种情况下,我有文章和页面(有点像WordPress,或者实际上就像WordPress)。但我也计划增加更多的内容类型,如评论,课程,教程(累赘),甚至可能是可购买的电子书。
所有这些对象都有一个共同之处,即它们是内容的,因此它们将在前端显示它们的专用urls,比如/post /{slug}表示posts,/{slug}表示页面,/ reviews /{slug}用于评论等等。
在后端,这意味着为这些内容类型提供了一个自动保存和修改系统。
因此,这将留给我们以下选择:
either)
在googling上搜索了这里的堆栈溢出并查看了其他项目之后,我想到了以下结构:
目录
id
site_id
title
... (some more columns that are shared among all models)
contentable_type
contentable_id发布
id页面
id
home课程
id
name
featured
difficulty
free因此,这些表将通过belongsTo关系链接到内容表,而内容模型将定义morphable关系。
class Content extends Eloquent {
public function contentable(){
return $this->morphTo();
}
}class Post extends Eloquent (or Content) {
public function content(){
return $this->morphOne('Content', 'contentable');
}
}使用模型意味着您必须始终加载内容关系。
排序和排序必须由联接执行。
当然,在创建时,我们必须首先创建内容类型模型,然后保存它并将其属性化为内容模型。
我以前从来没有用这种(子)逻辑实现过一个系统,我觉得只有一个id的posts表有点奇怪(其他类型的内容(例如,在没有额外列的情况下也是这样),但是我认为这将是解决这个问题的"Laravel方式“,对吗?
我相信STI不适用于这个案子,这也有点违背了Laravel雄辩的模式。
有人已经有这种方法的经验了吗?我在这里走得对吗?
注:我受到以下讨论的启发:How can I implement single table inheritance using Laravel's Eloquent?
发布于 2022-05-12 16:30:09
以防有人发现这个问题。我最终决定不采用这种方法,基本上是因为我认为它不值得付出努力(而且大多数包都无法发挥作用)。
使用特性等来重用尽可能多的逻辑并遵循雄辩的ORM方法是一种更好的方法。
https://stackoverflow.com/questions/72113752
复制相似问题