基本情况如下。一个部分是一个资源蓝图,可以包含多个字段,一个Entry是这个蓝图的记录。Laravel 4雄辩,“动态”关系?
class Entry extends Model
{
public function section()
{
return $this->hasOne('Section');
}
}
我的问题至今: 因此,让我们假设我有一个Field
模型,其中场可以有不同的类型,和一个值(内容)。
理想地,动态内容属性将是一个以一对一的关系像
class Field extends Model
{
public function content()
{
return $this->hasOne('ContentModel');
}
}
然而,ContentModel
类将基于字段的类型值。
每种类型都代表不同的typemodel,它知道如何写它的值(为简单起见,让我们假设有3种类型,input
,text
,int
,和对应的3的模型类ContentInput
,ContentText
,和ContentInt
)
sections (Section)
- id (char, 36) // uuid
- label (varchar)
- handle (varchar)
entries (Section)
- id (char, 36) // uuid
- section_id (char, 36) // uuid of the section
fields (Field)
- id (integer)
- section_id (char, 36) // uuid of the section
- type (varchar) // the content model class
- handle (varchar)
- label (varchar)
content_input (ContentInput)
- id
- entry_id (char, 36) // entry record of a section
- field_id (integer)
- value (varchar)
content_text (ContentText)
- id
- entry_id (char, 36) // entry record of a section
- field_id (integer)
- value (text)
content_int (ContentInt)
- id
- entry_id (char, 36) // entry record of a section
- field_id (integer)
- value (integer)
// ... there're many more content types.
我在想多态关系,但他们不适合这个特定的情况。
有没有任何有效的方法来实现这一点雄辩?
[EDIT NOTES]:
我已经更新如上我是有点不清楚这些实施例。 一种可能的解决方案是根据部分定义动态创建入口模型类。
class Entry_249fcb61_4253_47d5_80ab_e012e19e7727 extends Entry
{
protected $with = ['gettext', 'getinput', 'getint'];
public function gettext()
{
return $this->hasMany('ContentText', 'entry_id');
}
// and so on
}
还不知道这是否是要走的路。
不是一种解决方案,而是稍微类似的:几个月前,我正在玩一个“[脚手架包](https://github.com/nils-werner/laravel-scaffold/blob/master/src/NilsWerner/Scaffold/Managers/FieldManager.php)”,做了某种动态表格布局探测寻找了解哪些列类型在那里。然后它会创建特定字段类型的实例。 –