You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Eloquent关联查询获取指定客户特定问卷问题的全部答案

Eloquent查询优化方案

原有查询的问题

你现有的写法会加载客户关联、所有问卷的全部回答、所有回答对应的问题和题型数据,存在大量冗余查询和数据传输,性能极低,完全不符合你的实际需求。

最优实现方案

方案1:仅需获取答案值(适合生成图表场景,性能最高)

如果你只需要拿到所有1-5分的答案集合,直接从questionnaire_answers表反向查询即可,仅需2次SQL查询,无冗余数据:

假设固定的第1道严重程度打分题的questionnaire_question_id为1,请替换为你实际的题ID

$answers = QuestionnaireAnswer::whereHas('questionnaire', function ($query) {
    $query->where('client_id', 2);
})
->where('questionnaire_question_id', 1)
->pluck('answer');

返回结果就是所有符合条件的打分值数组,可直接用来生成图表。

方案2:需要同步返回问卷关联信息

如果你需要同时获取问卷的其他字段搭配答案使用,可以用带约束的预加载,只加载你需要的关联数据:

$questionnaires = Questionnaire::where('client_id', 2)
->with(['questionnaire_answers' => function ($query) {
    // 仅预加载第1题的回答,仅查询需要的字段
    $query->where('questionnaire_question_id', 1)
          ->select('id', 'questionnaire_id', 'answer');
}])
// 仅查询需要的问卷字段
->select('id', 'client_id')
->get();

优化点说明

  • 移除了所有不需要的关联加载:clients、questionnaire_question、questionnaire_question_type
  • 对预加载的回答关联增加了条件过滤,只返回你需要的第1题答案,避免加载所有题的回答
  • 增加select指定仅查询需要的字段,大幅减少数据传输开销

动态匹配第1题补充说明

如果你的第1题不是固定ID,是每个问卷中排序第一的问题,且questionnaire_questions表存在排序字段(比如sort),可以调整查询条件适配:

$answers = QuestionnaireAnswer::whereHas('questionnaire', function ($q) {
    $q->where('client_id', 2);
})
->whereHas('questionnaire_question', function ($q) {
    // 排序为1的即为第1题
    $q->where('sort', 1);
})
->pluck('answer');

内容的提问来源于stack exchange,提问作者bgeertsema2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:15:05