Laravel合并两个集合报错:Call to a member function getKey() on array
问题解决:Laravel集合合并报错及后续处理
错误原因
你遇到的Call to a member function getKey() on array错误,是因为$this->existDates是Eloquent Collection——即使你用map把模型转成了数组,集合本身的类型还是Eloquent集合。Eloquent集合的merge方法是为模型设计的,会尝试调用每个元素的getKey()方法处理合并逻辑,但你的元素是普通数组,没有这个方法,因此触发报错。
解决步骤及代码修改
1. 统一集合类型为普通Support集合
优化输入集合构建(可选,更简洁)
替换原来的foreach循环,用collect直接处理请求数据:
$this->inputDates = collect($request->get('dates'))->map(function ($date) { return [ "starttime" => $this->convert($date['starttime']), "endtime" => $this->convert($date['endtime']) ]; });
转换Eloquent集合为普通集合
在获取数据库数据后,用toBase()方法将Eloquent集合转为普通的Illuminate\Support\Collection:
$this->existDates = $this->get($this->user->getId()) ->map(fn($model) => $model->only(['starttime', 'endtime'])) ->toBase(); // 关键操作:避免merge时调用模型专属方法
2. 合并集合
现在两个集合都是普通类型,直接执行merge不会报错:
$this->allDates = $this->existDates->merge($this->inputDates);
3. 扁平化数组并排序
将合并后的集合中的starttime和endtime提取为一维数组,再排序:
// 方法1:用flatMap一次性提取所有日期 $flatSortedDates = $this->allDates->flatMap(function ($item) { return [$item['starttime'], $item['endtime']]; })->sort()->values()->all(); // 方法2:分别提取后合并排序(逻辑更直观) $flatSortedDates = $this->allDates->pluck('starttime') ->merge($this->allDates->pluck('endtime')) ->sort() ->values() // 重置索引,避免排序后索引混乱 ->all(); // 转换为普通数组
最终$flatSortedDates就是你需要的[date1, date2, date3...]格式的排序后数组。
内容的提问来源于stack exchange,提问作者Farhida Arahid
相关产品推荐
相关产品推荐

