Laravel如何基于user_id对eventQuestionUsers关联集合进行分组
实现方案
首先先修正你原有代码的小问题:你查询单个事件时用了get()方法,返回的是模型集合而非单个Event实例,会导致后续权限判断、关联预加载逻辑异常,需要改为firstOrFail()。
Laravel 集合已经内置了groupBy()方法,完全可以满足你的分组需求,不需要自定义遍历方法。你对集合不可变的顾虑是多余的:集合的不可变指的是调用操作方法时不会修改原集合,而是返回新的集合实例,直接将返回的分组后集合赋值给关联属性即可。
修改后的控制器代码如下:
public function show($event_id) { $user = Auth::user(); // 查单个事件用firstOrFail,匹配不到时自动抛出404异常 $event = Event::where('id', $event_id)->firstOrFail(); if ($user->can('manage', $event)) { // 预加载关联后调用groupBy按user_id分组,直接赋值回关联属性 $event->load('eventQuestionUsers'); $event->eventQuestionUsers = $event->eventQuestionUsers->groupBy('user_id'); // 如果你需要纯数组结构而非集合,可改为: // $event->eventQuestionUsers = $event->eventQuestionUsers->groupBy('user_id')->toArray(); } return view('single_event', [ 'event' => $event ]); }
上述代码输出的eventQuestionUsers结构和你预期的完全一致,符合Laravel的编码规范。
内容的提问来源于stack exchange,提问作者Zeth
相关产品推荐
相关产品推荐

