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
相关产品推荐
相关产品推荐

