Laravel中FirstWhere方法异常,调用push()时出现null错误求助
排查「Call to a member function push() on null」错误及解决方案
咱们一步步拆解这个问题,这个错误的核心是你尝试在一个null值上调用push()方法,我帮你梳理几个最可能的原因和对应的修复方案:
1. 首先确认数据的访问方式:数组 vs 对象
你给出的$balance结构是数组格式(比如{"data": [...]}),如果实际业务中$balance是PHP数组而非对象,那你在foreach里用$firm->name和$firm->y就错了——数组元素得用索引访问,也就是$firm['name']和$firm['y']。
如果这里误用对象访问,会导致获取到的name是null,firstWhere('name', null)自然找不到匹配项,返回null,后续访问['data']还是null,调用push()就直接报错了。
2. 检查$statistics集合元素的类型
如果你的$statistics是Laravel集合,但集合里的每个元素是普通PHP数组(比如你给出的示例格式),那firstWhere返回的是一个数组,['data']就是普通数组,而数组没有push()方法(push()是Laravel集合的专属方法)。这时候要么把数组转成集合,要么用PHP原生的array_push()或者直接追加元素。
3. 额外排查:特殊字符的匹配问题
注意到你有一个name是「Краситель」(西里尔字母),如果数据传输或存储时出现编码异常,可能导致name匹配失败,firstWhere返回null,也会触发这个错误。
修正后的代码示例
场景一:$balance是数组,$statistics集合元素是普通数组
foreach ($balance["data"] as $firm) { // 先找到匹配的统计项,避免直接操作null $statItem = $statistics->firstWhere('name', $firm['name']); if ($statItem) { // 普通数组用原生方式追加元素 $statItem['data'][] = $firm['y']; // 或者用 array_push($statItem['data'], $firm['y']); } }
场景二:$balance是数组,$statistics集合元素是对象(比如Eloquent模型)
foreach ($balance["data"] as $firm) { $statItem = $statistics->firstWhere('name', $firm['name']); if ($statItem) { // 对象的data如果是集合,直接用push() $statItem->data->push($firm['y']); } }
优化建议:提升匹配效率
如果数据量较大,建议先把$balance转成name => y的关联数组,避免每次遍历集合查找:
// 先构建balance的name映射表 $balanceMap = collect($balance["data"])->pluck('y', 'name')->toArray(); // 遍历statistics直接匹配 foreach ($statistics as &$statItem) { if (isset($balanceMap[$statItem['name']])) { $statItem['data'][] = $balanceMap[$statItem['name']]; } }
内容的提问来源于stack exchange,提问作者Saidmurod Saidkhonov
相关产品推荐
相关产品推荐

