问题描述
因此,我们正在开发基于OctoberCMS的Web应用程序,我们有以下要求:有宏部分,部分和子部分。每个子节都属于一个节,并且每个节都属于一个宏节。但是,子节并不总是存在。
还有产品,每个产品都有一个类别,该类别可能属于一个子节,节或宏节。
例如,在类似Django的项目中,我将实现类似复合模式的项目,我有一个基本节模型(BaseSection),以及该类的3个子级,即MacroSection,Section和Subsection。
然后我可以:在BaseSection中设置一个可为空的“父”字段,它是BaseSection本身的外键;或为每个子级设置不同的字段,以限制结构(MacroSection将没有任何子段,section将具有MacroSection父字段,而subsection是Section父字段)。
最后,我将在产品类别模型中有一个BaseSection字段(因为类别可以属于层次结构中的任何地方)。
我所拥有的最好的方法是:仅创建一个“ base_section”表,并带有一个附加字段说明该节的类型。像这样:
Schema::create('base_section',function($table) {
//other fields
$table->foreign('parent_section')->references('id')->on('base_section')->nullable();
//Does that even work here by the way? Or do I have to make another instruction after the create?
$table->string('section_type');
});
然后我使用October模型定义所有节类:
class BaseSection extends Model {
protected $table = 'base_section';
}
class Subsection extends BaseSection {
public function beforeCreate() {
$this->section_type = 'subsection';
}
}
//Other classes
我缺少一些层次结构上的限制,但我可以稍后进行处理。
这有意义吗?有更好的解决方案吗?
谢谢。
解决方法
您提出的建议应该可行,但还要研究多态关系,以使可能适合您的模型,但不确定:
https://octobercms.com/docs/database/relations#polymorphic-relations