语境:
当用户(会议创建者)创建会议时,他可以为该会议创建注册表单.因此,他访问页面“http://proj.test/conference/edit/1/questions”以将表格编辑到ID为1的会议.
在此页面中,他可以通过复选框将现有问题与每个注册类型相关联.他还可以单击“添加自定义问题”以向表单添加更多自定义问题.
例如,他可以创建一个自定义问题“你的电话号码是什么?”并且可以将此问题与例如注册类型“常规”或之前已创建的任何其他所有注册类型相关联.
因此,当会议创建者访问“http://proj.test/conference/edit/1/questions/create”时,他可以访问表单以为id为1的会议创建新的自定义问题.
在此表单中,用户(会议创建者)需要选择问题的标题(例如:电话号码)和问题类型(例如:文本),然后单击“存储问题”.
问题字段的类型是具有5个选项的选择菜单(文本,长文本,单选按钮,选择菜单和复选框).
如果用户选择问题类型作为单选按钮,则选择菜单或复选框会显示一些文本输入,以便用户可以插入每个选项的值.
然后在用户进行注册的前端,例如用户John在注册类型“Rt 001”中注册了2个参与者,他和Jake,因此他需要填写表格,在这种情况下,他需要填写每个参与者的字段,因为会议创建者选择了“从所有参与者收集信息”选项.注册表始终询问进行注册的用户的姓名和电子邮件,但在这种情况下,注册表还会询问用户“您的电话号码是什么”,因为会议创建者创建的此字段由会议关联创建者到用户注册的注册类型(Rt 001):
释疑:
我对如何根据表,列和关系组织这个上下文以正确建模这些部分有一些疑问:
>如果该字段是强制性的,则可以创建自定义问题并存储
>当用户以一种或多种会议注册类型在会议中进行注册时,以后收集答案的部分
>会议创建者选择可以选择的部分可以选择从所有参与者收集数据,或仅为进行注册的用户收集数据
//会议模型
class Conference extends Model
{
// A conference has many registration types
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
// A conference can have many questions
public function questions(){
return $this->hasMany('App\Question', 'conference');
}
// A conference has one organizer
public function organizer(){
return $this->belongsTo('App\User', 'user_id');
}
}
RegistrationType模型:
class RegistrationType extends Model
{
public function conference(){
return $this->belongsTo('App\Conference');
}
// A registration type has many questions
public function questions(){
return $this->hasMany('App\Question', 'registration_type_id');
}
}
//问题模型
class Question extends Model
{
public function conference(){
return $this->belongsTo('App\Conference');
}
public function registration_type(){
return $this->belongsTo('App\RegistrationType');
}
}
数据库图表,它不完整,可能不正确,无法模拟此上下文,但显示我现在的图像图:http://ibb.co/gVYVJS
最佳答案 根据我从问题和讨论中获得的信息,我已经进行了架构更改.注意:在此模式中,我使用laravel使用的命名标准(默认情况下).像多个表名一样,主键是’id’等.
大部分内容与问题中的模式类似.我会解释一下,
> users – 包含会议创建者的表.
> meetings – meetings,created_user_id是创建它的用户.
> registration_types – 保存其所属会议的注册类型和conference_id链接.
>问题 – 用conference_id显示问题,显示哪个会议问题属于,
> registration_types数据透视表,用于将注册类型保存到问题映射.
>注册 – 保存注册信息的表.
>参与者 – 为具有姓名和电子邮件字段的参与者保留条目.每个参与者都有单独的registration_type.
>答案 – 保持每个参与者给出的答案.它有question_id来表明哪个问题& participant_id表示它属于哪个参与者.
上述模式为每种注册类型添加了必需的选项,因此您可以在一种类型中强制提出问题,而在另一种类型中不强制使用.必填字段作为extra attribute添加到registration_type_questions数据透视表.
根据注册类型查找问题
class RegistrationType extends Model
{
public function questions(){
return $this->belongsToMany(App\Question::class, 'registration_type_questions');
}
}
$registration_type->questions->withPivot('required');
添加参与者的问题答案.
class Answer extends Model
{
public function question(){
return $this->belongsTo(App\Question::class);
}
public function participant(){
return $this->belongsTo(App\Participant::class);
}
}
Answer::create([
'participant_id' => $participant_id,
'question_id' => $question_id,
'answer' => 'answer'
])
在问题表中使用conference_id
conference_id召开会议,问题属于哪个.这对于在编辑/创建会议页面中显示已创建的问题非常有用.
如何处理用户注册,
only_for_registration标志用于给定会议创建页面的“仅来自持有注册的用户”选项.如果为false,则表示您不会向其他参与者显示姓名和电子邮件字段.
例
为了更清楚,让我来看看你给出的例子.
>会议创建者“Jake”在系统上创建一个帐户.
>我们将在用户表中创建一个包含必要帐户字段的条目.
>“Jake”创建一个新会议并选择“所有参与者”选项.
>在会议桌中创建一个新条目,其名称和only_for_registration标志设置为false(因为Jake选择“所有参与者”).
>“Jake”为“rt 1”和“rt 2”创建两种注册类型.
>使用conference_id(来自步骤2)和名称在registration_types表中创建两个条目. id为1的“rt 1”和id为2的“rt 2”.
>“杰克”创建一个问题“你的电话号码是什么?”与文本类型.
>在问题表中创建一个带有问题文本的条目,并将“conference_id”作为来自step2的id创建.现在,您可以使用Questions :: where(“confrence_id”,$current_confrence_id) – > get()在confrence编辑页面中显示问题.这就是问题表中confrence_id的用法.
>“杰克”助手“你的电话号码是什么?”问题只有“rt 2”.
>使用’question_id’1(来自步骤4),registration_type_id 2(来自“rt 2”的步骤3)在registration_type_questions中添加条目.如果选择“Jake”,则必须将问题设置为true.
>在前端“John”进入注册页面并点击“注册”.
>“John”选择2个“rt 1”参与者和2个“rt 2”参与者并单击“下一步”.
>由于我们来自会议页面,我们已经有了conference_id,使用$conference-> registrationTypes oneToMany关系获取所有registration_types.
>一旦约翰按下“下一步”,您就可以将此信息保存在会话中或前端.由于未提供用户信息,因此无需在此阶段提交数据库.
>“John”看到表单填写4个用户条目,所有用户条目都有姓名和电子邮件字段,2个条目有额外的“你的电话号码是什么?”题.
>默认情况下,仅显示第一个条目的名称和电子邮件,但由于only_for_registration标志为false,因此显示所有条目的名称和电子邮件字段.
>对于每个条目,使用$registation_type->问题关系获取问题.因为只有2个条目有“rt 2”,我们只会显示“你的电话号码是什么?”到2个字段并保持隐藏的question_id字段.
>(可选)对于所有条目,用户可以在他选择的注册类型之间切换.这样他就可以灵活地选择第一个参与者,即他自己是rt2.
>“John”填写所有问题的答案,然后单击“下一步”.
>在“注册”表中创建一个条目.
>循环执行步骤8中的所有条目.
>在参与者表中创建一个条目,其中包含来自step8的registration_id,registration_type值以及电子邮件和名称.如果其他用户不需要,请将电子邮件和名称保留为空.
>如果问题是自定义问题,请在答案表中创建一个条目,其中包含最后一个参与者ID和隐藏的question_id字段.
如果only_for_registration标志为真,即“Jake”选择“仅来自进行注册的用户”,那么您只能向第一个条目显示电子邮件和名称字段.