Laravel Eloquent addSelect子查询使用get()报未知字段错误如何解决
错误原因
你在addSelect中直接调用了get()方法,会导致CampaignEventStatusUser的查询在构造外层events查询时就提前执行,此时外层events表还未进入SQL执行上下文,因此找不到events.id字段。
解决方案
方案1:SQL层面实现逻辑(推荐,性能更高)
直接用子查询实现「每个用户取最新记录后统计status_id=1的数量」的逻辑,完全等价你之前用集合unique的效果,无需提前调用get():
return EventGroup::where('id', 1)->with(['events' => function($q) { $q->addSelect(['reg_count' => function ($subQuery) { $subQuery->selectRaw('COUNT(*)') ->from('campaign_event_status_users as cesu') // 取同个活动下同个用户的最新(最大ID)记录 ->whereRaw('cesu.id = ( SELECT MAX(id) FROM campaign_event_status_users WHERE event_id = events.id AND user_id = cesu.user_id )') ->where('cesu.status_id', 1); }]); }])->get();
方案2:预加载数据后用集合处理(适合小数据量场景)
如果你坚持使用集合的unique方法处理逻辑,可以先预加载关联数据,查询完成后再计算reg_count:
- 首先在
Event模型中定义关联:
// App/Models/Event.php public function campaignEventStatusUsers() { return $this->hasMany(CampaignEventStatusUser::class, 'event_id'); }
- 调整查询代码:
return EventGroup::where('id', 1) ->with('events.campaignEventStatusUsers') ->get() ->each(function ($group) { $group->events->each(function ($event) { $event->reg_count = $event->campaignEventStatusUsers ->sortByDesc('id') // 等价原latest()逻辑 ->unique('user_id') ->where('status_id', 1) ->count(); // 隐藏不需要返回的关联属性 $event->makeHidden('campaignEventStatusUsers'); }); });
两种方案最终返回的reg_count结果都是2,符合你的预期。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

