OctoberCMS/Laravel 中的模型继承(复合模式)
Model inheritance in OctoberCMS/Laravel (composite pattern)
所以,我们正在开发一个基于OctoberCMS 的web 应用程序,我们有以下需求:有宏部分、部分和子部分。每个小节属于一个节,每个节属于一个宏节。虽然小节并不总是存在。
还有产品,每个产品都有一个类别,那个类别可能属于一个子部分,部分或宏部分。
例如,在 Django 之类的东西中,我会实现类似复合模式的东西,我有一个基本部分模型 (BaseSection),以及其中的 3 children 个 class,MacroSection 、章节和小节。
然后我可以:在 BaseSection 中设置一个可为空的“parent”字段,这是 BaseSection 本身的外键;或者每个 children 有不同的字段来限制结构(MacroSection 不会有任何,section 会有一个 MacroSection parent 字段,而 subsection 有一个 Section parent 字段)。
最后,我会在产品类别模型中有一个 BaseSection 字段(因为该类别可以属于层次结构中的任何位置)。
但我不确定在这里实现它的最佳方法是什么。
我拥有的最好的是:只创建一个“base_section”table,并在一个附加字段中说明它是什么类型的部分。像这样:
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 模型来定义所有部分 classes:
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
所以,我们正在开发一个基于OctoberCMS 的web 应用程序,我们有以下需求:有宏部分、部分和子部分。每个小节属于一个节,每个节属于一个宏节。虽然小节并不总是存在。
还有产品,每个产品都有一个类别,那个类别可能属于一个子部分,部分或宏部分。
例如,在 Django 之类的东西中,我会实现类似复合模式的东西,我有一个基本部分模型 (BaseSection),以及其中的 3 children 个 class,MacroSection 、章节和小节。
然后我可以:在 BaseSection 中设置一个可为空的“parent”字段,这是 BaseSection 本身的外键;或者每个 children 有不同的字段来限制结构(MacroSection 不会有任何,section 会有一个 MacroSection parent 字段,而 subsection 有一个 Section parent 字段)。
最后,我会在产品类别模型中有一个 BaseSection 字段(因为该类别可以属于层次结构中的任何位置)。
但我不确定在这里实现它的最佳方法是什么。
我拥有的最好的是:只创建一个“base_section”table,并在一个附加字段中说明它是什么类型的部分。像这样:
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 模型来定义所有部分 classes:
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