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

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:

  1. 首先在Event模型中定义关联:
// App/Models/Event.php
public function campaignEventStatusUsers()
{
    return $this->hasMany(CampaignEventStatusUser::class, 'event_id');
}
  1. 调整查询代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:06:04