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

如何从pivot表中筛选出未注册为大使的用户数据

解决未注册大使用户的查询重复问题

你的问题出在用!=做关联条件,这种写法会触发笛卡尔积:ambassadors_users里的每一条记录,都会和所有不匹配的users记录关联,自然会出现大量重复数据,而且最终拿到的是两张表的混合数据,不是你需要的纯用户列表。

给你三种靠谱的写法,按需选择:

方法一:用whereNotExists(性能最优,适合大数据量)

这种写法直接告诉数据库:找那些在ambassadors_users里没有对应记录的用户

$users = DB::table('users')
    ->whereNotExists(function ($query) {
        $query->select(DB::raw(1))
              ->from('ambassadors_users')
              ->whereColumn('ambassadors_users.user_id', 'users.id');
    })
    ->get();

方法二:用leftJoin + whereNull(逻辑直观)

通过左连接保留所有用户,再筛选出没有关联大使记录的用户

$users = DB::table('users')
    ->leftJoin('ambassadors_users', 'users.id', '=', 'ambassadors_users.user_id')
    ->whereNull('ambassadors_users.user_id')
    ->select('users.*') // 明确只取users表的字段,避免冗余
    ->get();

方法三:用whereNotIn(代码最简洁,适合小数据量)

先拿到所有已注册大使的用户ID,再排除这些ID的用户

// 先获取所有已成为大使的用户ID数组
$registeredUserIds = DB::table('ambassadors_users')->pluck('user_id')->toArray();

// 筛选出不在数组里的用户
$users = DB::table('users')
    ->whereNotIn('id', $registeredUserIds)
    ->get();

如果用Eloquent模型的话,写法会更简洁,比如你有User模型,且已定义和Ambassador的关联关系:

// User模型里的关联定义
public function ambassadors()
{
    return $this->belongsToMany(Ambassador::class, 'ambassadors_users');
}

// 查询未注册大使的用户
$users = User::whereDoesntHave('ambassadors')->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:32:46