Laravel中用前次查询结果查询数据库报Undefined index: hash错误如何解决
问题原因
- 你的代码存在三类问题:
- 语法错误:
Model1:all()和Model2:all()少写了一个冒号,正确写法为Model1::all()、Model2::all() - 逻辑错误:Laravel的Collection执行排序操作时默认保留原有索引,你调用
sortByDesc后没有重置索引,take(1)取出的单条数据仍然保留原来在集合中的索引值,转成数组后外层是动态索引的二维数组,自然无法直接通过$firstResults["hash"]读取字段。 - 性能问题:先调用
all()查询全表数据再做排序、过滤的写法会在表数据量大时造成严重性能损耗,完全没必要在内存中处理全表数据,直接在数据库查询阶段完成条件、排序逻辑即可。
- 语法错误:
- 外层索引每次刷新自增的原因:每次请求时Model1对应表有新增数据,
all()查询出的集合长度持续增加,你需要的那条记录在集合中的位置逐次后移,所以索引值会每次+1。
最优解决方案
直接在查询构造器阶段完成排序、取单条的逻辑,避免全表扫描,也不会出现动态索引问题:
// 直接查询id最大的单条记录,返回Model1实例 $firstResult = Model1::orderByDesc('id')->first(); // 直接在查询构造器中加hash条件,避免全表查询Model2 $secondResults = Model2::where('hash', $firstResult->hash)->get()->toArray();
兼容原有写法的修复方案
如果你坚持要先查全表再做集合处理,可以调用values()方法重置集合索引:
// values()会将集合索引重置为从0开始的连续数字 $firstResults = Model1::all()->sortByDesc('id')->take(1)->values()->toArray(); $secondResults = Model2::where('hash', $firstResults[0]['hash'])->get()->toArray();
也可以直接从集合中取第一条数据,不需要提前转数组:
$firstResult = Model1::all()->sortByDesc('id')->first(); $secondResults = Model2::where('hash', $firstResult->hash)->get()->toArray();
内容的提问来源于stack exchange,提问作者PaulD
相关产品推荐
相关产品推荐

