Laravel报错:调用字符串的unique()方法,如何去除集合重复值?
解决Laravel中「Call to a member function unique() on string」错误
错误原因
报错核心问题是:$item->subarea是单个字符串值,而unique()是Laravel集合(Collection)的专属方法,不能直接在字符串上调用。你要实现的是同一nome_area下所有subarea值的去重,而非对单个subarea值操作。
修正方案
方案一:优化原有循环逻辑
先收集同一分组下的所有subarea,最后统一去重:
$cercasub1 = DB::table('assoc') ->where('employee', $name) ->whereIn('nome_area', $cercaaree) ->select(['nome_area', 'subarea']) ->get(); // 保留集合类型,更便于后续操作 $cercasub = []; foreach ($cercasub1 as $item) { $subKey = $item->nome_area; // 先将所有subarea归入对应分组 $cercasub[$subKey][] = $item->subarea; } // 对每个分组的subarea数组去重 foreach ($cercasub as $key => $subareas) { $cercasub[$key] = array_unique($subareas); // 若需保持原代码的嵌套结构,可替换为: // $cercasub[$key] = array_map(function($sub) { // return ['subarea' => $sub]; // }, array_unique($subareas)); }
方案二:用Laravel集合链式操作简化代码
借助集合的groupBy和map方法,一步完成分组+去重:
$cercasub = DB::table('assoc') ->where('employee', $name) ->whereIn('nome_area', $cercaaree) ->select(['nome_area', 'subarea']) ->get() ->groupBy('nome_area') ->map(function ($group) { // 提取分组内的subarea并去重,返回数组格式 return $group->pluck('subarea')->unique()->toArray(); // 若需匹配原代码的嵌套结构,替换为: // return $group->pluck('subarea')->unique()->map(function($sub) { // return ['subarea' => $sub]; // })->toArray(); }) ->toArray();
关键提示
- 尽量保留查询结果为Laravel集合(避免过早调用
toArray()),集合提供了大量便捷操作方法,比原生数组更高效。 array_unique()是PHP原生数组去重方法,集合的unique()是Laravel封装的方法,可根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者Morex
相关产品推荐
相关产品推荐

