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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:52:05