Laravel项目中如何展示参会者的自定义问题与对应答案?
解决自定义问题与答案展示的方案
首先,你猜的没错,我们确实需要在Participant和Answer之间建立一对多关系——毕竟每个参会者(Participant)会对应多个自定义问题的答案(Answer)。接下来一步步来实现:
1. 完善模型关联
先把你的Answer模型补全,同时给Participant模型添加关联到Answer:
Participant 模型
class Participant extends Model { // 已有的关联... public function registration(){ return $this->belongsTo('App\Registration'); } public function ticket_type(){ return $this->belongsTo('App\TicketType'); } // 添加:一个参会者对应多个答案 public function answers(){ return $this->hasMany('App\Answer'); } }
Answer 模型
class Answer extends Model { public function question(){ return $this->belongsTo('App\Question'); } // 补全:答案属于一个参会者 public function participant(){ return $this->belongsTo('App\Participant'); } }
2. 预加载关联避免N+1查询
为了避免视图循环时产生大量重复数据库查询,在控制器获取会议数据时,要预加载嵌套关联:
$congress = Congress::with([ 'registrations.customer', 'registrations.participants.ticket_type.questions', 'registrations.participants.answers.question' ])->find($congressId);
3. 在视图中展示问题与答案
现在把你标记<!-- Doubt -->的位置替换成如下代码,就能展示每个参会者对应的自定义问题和答案了:
@foreach ($participant->ticket_type->questions as $question) <dt>{{ $question->text }}</dt> {{-- 匹配参会者针对该问题的答案 --}} <dd>{{ $participant->answers->firstWhere('question_id', $question->id)->value ?? '未填写' }}</dd> @endforeach
说明
- 这里假设
Question模型用text字段存问题内容(比如"Whats your phone?"),Answer模型用value字段存用户填写的答案,如果你字段名不同,记得对应修改。 - 先获取当前参会者对应票型的所有自定义问题,再从参会者的答案集合中匹配对应问题的答案。
- 用
?? '未填写'处理用户未填写答案的边界情况。
额外提示
确保在存储注册信息时,正确将每个参会者的答案与participant_id、question_id关联后存入answers表,这样关联查询才能正常工作。
内容的提问来源于stack exchange,提问作者user9659025
相关产品推荐
相关产品推荐

