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

