OctoberCMS / Laravel中的模型继承复合模式

问题描述

因此,我们正在开发基于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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...