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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:05:30