php – 如何建模这个上下文,以便创建自定义问题和收集答案?
语境:
当用户(会议创建者)创建会议时,他可以为该会议创建注册表单.因此,他访问页面“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('AppRegistrationType','conference_id'); } // A conference can have many questions public function questions(){ return $this->hasMany('AppQuestion','conference'); } // A conference has one organizer public function organizer(){ return $this->belongsTo('AppUser','user_id'); } } RegistrationType模型: class RegistrationType extends Model { public function conference(){ return $this->belongsTo('AppConference'); } // A registration type has many questions public function questions(){ return $this->hasMany('AppQuestion','registration_type_id'); } } //问题模型 class Question extends Model { public function conference(){ return $this->belongsTo('AppConference'); } public function registration_type(){ return $this->belongsTo('AppRegistrationType'); } } 数据库图表,它不完整,可能不正确,无法模拟此上下文,但显示我现在的图像图:http://ibb.co/gVYVJS 解决方法
根据我从问题和讨论中获得的信息,我已经进行了架构更改.注意:在此模式中,我使用laravel使用的命名标准(默认情况下).像多个表名一样,主键是’id’等.
大部分内容与问题中的模式类似.我会解释一下, > users – 包含会议创建者的表. 上述模式为每种注册类型添加了必需的选项,因此您可以在一种类型中强制提出问题,而在另一种类型中不强制使用.必填字段作为extra attribute添加到registration_type_questions数据透视表. 根据注册类型查找问题 class RegistrationType extends Model { public function questions(){ return $this->belongsToMany(AppQuestion::class,'registration_type_questions'); } } $registration_type->questions->withPivot('required'); 添加参与者的问题答案. class Answer extends Model { public function question(){ return $this->belongsTo(AppQuestion::class); } public function participant(){ return $this->belongsTo(AppParticipant::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”进入注册页面并点击“注册”. >由于我们来自会议页面,我们已经有了conference_id,使用$conference-> registrationTypes oneToMany关系获取所有registration_types. >“John”看到表单填写4个用户条目,所有用户条目都有姓名和电子邮件字段,2个条目有额外的“你的电话号码是什么?”题. >默认情况下,仅显示第一个条目的名称和电子邮件,但由于only_for_registration标志为false,因此显示所有条目的名称和电子邮件字段. >“John”填写所有问题的答案,然后单击“下一步”. >在“注册”表中创建一个条目. >在参与者表中创建一个条目,其中包含来自step8的registration_id,registration_type值以及电子邮件和名称.如果其他用户不需要,请将电子邮件和名称保留为空. 如果only_for_registration标志为真,即“Jake”选择“仅来自进行注册的用户”,那么您只能向第一个条目显示电子邮件和名称字段. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |