我正在使用Laravel 5.1
来构建用于创建表单的应用程序。
每个表单都是Form模型的一个实例。每个表单可能具有不同的字段范围。可能的字段在Fields表(i.e: *first_name*, *surname*, *date_of_birth*, *postcode*, etc
)中定义。 Form和Field模型之间存在许多关系。
为了收集表单数据,我正在考虑为每个Form实例创建一个新表。
例如,用户创建一个包含字段*first_name*, *surname*, *date_of_birth* and *postcode*
的表单。添加表单后,将使用
Schema::create('form_' . $form->id, function($table) {[... fields ...}).
当用户提交表单时,将使用Form实例作为模型验证数据,然后将其插入到定义的表中。
我怀疑这是一个坏的或非正统的想法(主要是因为在飞行中创建表格感觉有风险)但会欣赏第二意见。
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
你是对的,相信你怀疑某些东西对于动态创建表格感觉不太正确感觉。这真的不是一个好主意。用于运行应用程序的用户可能不应具有CREATE权限,但这是一个单独的主题。
一个解决方案,做你想做的就是有三个不同的表,并利用多态来存储代表每个表单的不同数据类型。
注意:每个表中的字段仅作为示例给出,您可能需要根据自己的业务需求进行扩展。
此表存储已创建的每个表单。
|--------------------------------------------------------------------|
| id | name | description | creator_id |
|--------------------------------------------------------------------|
| 1 | Example form | An example of how to setup forms. | 1 |
|--------------------------------------------------------------------|
此表存储表单中可用的每个字段。 required
字段显示了如何开始构建验证规则。可以添加更多列以扩展此想法(最小值,最大值等)。
|--------------------------------------------------------------------|
| id | form_id | type | label | required | default |
|--------------------------------------------------------------------|
| 1 | 1 | text | Name | 1 | |
| 2 | 1 | text | E-mail | 1 | |
| 3 | 1 | textarea | Comments | 1 | Your message |
|--------------------------------------------------------------------|
form_data
此表存储每个表单的提交数据。
|-----------------------------------------------------------------|
| id | form_id | field_id | data | created_at |
|-----------------------------------------------------------------|
| 1 | 1 | 1 | Joe | 2015-09-02 12:01:00 |
| 2 | 1 | 2 | joe@domain.com | 2015-09-02 12:01:00 |
| 3 | 1 | 3 | Test comment | 2015-09-02 12:01:00 |
|-----------------------------------------------------------------|