Laravel:如何从mergedEmployees中获取removedEmployees?当前diff代码失效
问题分析与解决方案
你当前代码的问题出在$mergedEmployees->diff($uniqueEmployees)的逻辑错误:diff方法的作用是返回第一个集合存在,但第二个集合不存在的元素。而$uniqueEmployees是$mergedEmployees去重后的结果,$mergedEmployees里的所有元素都能在$uniqueEmployees中找到(unique仅保留每个元素的首个实例),所以这个调用会返回空集合,无法得到你想要的重复员工(即被unique过滤掉的项)。
正确的实现方式
方式一:统计重复ID筛选重复员工
通过统计员工ID的出现次数,找出重复出现的员工实例:
$employees1 = Employee::where('employment_status', '<>', 'SEPARATED') ->where('client_code_1', $client->client_code) ->where('position', $grouping->position) ->where('billable_rate', $grouping->billable_rate) ->get(); $employees2 = Employee::where('employment_status', '<>', 'SEPARATED') ->where('client_code_2', $client->client_code) ->where('position', $grouping->position) ->where('billable_rate', $grouping->billable_rate) ->get(); $mergedEmployees = $employees1->merge($employees2); // 统计每个员工ID的出现次数 $idCounts = $mergedEmployees->countBy('id'); // 筛选出出现次数大于1的员工ID $duplicateIds = $idCounts->filter(fn($count) => $count > 1)->keys(); // 获取所有重复出现的员工实例(包含多次出现的条目) $removedEmployees = $mergedEmployees->filter(fn($emp) => $duplicateIds->contains($emp->id)); // 若只需每个重复员工的唯一实例,可追加unique(): // $removedEmployees = $mergedEmployees->filter(fn($emp) => $duplicateIds->contains($emp->id))->unique();
方式二:直接取两个集合的交集
因为合并后的重复员工,本质是同时存在于employees1和employees2中的员工,所以可以直接用交集方法:
$employees1 = Employee::where('employment_status', '<>', 'SEPARATED') ->where('client_code_1', $client->client_code) ->where('position', $grouping->position) ->where('billable_rate', $grouping->billable_rate) ->get(); $employees2 = Employee::where('employment_status', '<>', 'SEPARATED') ->where('client_code_2', $client->client_code) ->where('position', $grouping->position) ->where('billable_rate', $grouping->billable_rate) ->get(); // 直接获取两个集合共有的员工(即合并后重复的部分) $removedEmployees = $employees1->intersect($employees2);
这个方式更高效,不需要先合并再处理,直接找出两个查询结果的重叠部分。
内容的提问来源于stack exchange,提问作者Jimwel Dizon
相关产品推荐
相关产品推荐

