Laravel如何查询id必须同时包含[1,2,3]的用户,不使用whereIn
需求实现方案
逻辑澄清
关系型数据库中,单条数据的唯一主键id只能存在一个值,不存在「id同时等于1、2、3」的单条用户记录。你描述的需求实际可分为两类常见场景,以下分别给出不含
whereIn的实现方案。
场景1:仅当指定id的用户全部存在时,返回这些用户的详情
该场景下要求传入的[1,2,3]三个id对应的用户必须全部存在,只要有一个id查不到就返回空结果,实现代码如下(以Laravel查询构造器为例):
$targetIds = [1,2,3]; $userList = collect(); $allValid = true; // 逐个校验id是否存在,无缺失时才组装结果 foreach ($targetIds as $id) { $user = User::where('id', $id)->first(); if (empty($user)) { $allValid = false; break; } $userList->push($user); } // 存在无效id时清空结果 if (!$allValid) { $userList = collect(); }
场景2:查询同时关联了所有指定id的对应资源的用户
如果你的需求是查询同时拥有指定id的关联资源的用户(比如同时绑定了id为1、2、3的三个标签/角色的用户),可以用关联分组聚合的方式实现,示例代码如下(以用户和角色的多对多关联为例):
$targetRoleIds = [1,2,3]; $users = User::join('user_role', 'users.id', '=', 'user_role.user_id') ->where('user_role.role_id', 1) ->where('user_role.role_id', 2) ->where('user_role.role_id', 3) ->groupBy('users.id') ->havingRaw('COUNT(DISTINCT user_role.role_id) = ?', [count($targetRoleIds)]) ->select('users.*') ->get();
内容的提问来源于stack exchange,提问作者Mehadi
相关产品推荐
相关产品推荐

