Laravel打印查询构造器变量触发内存超出限制问题求解
问题原因
你打印的$bookingd始终是Laravel查询构造器对象,而非SQL执行后的结果集合:
你调用groupBy('mechanic_id')->pluck('mechanic_id')时确实触发了SQL执行,但是pluck方法的返回值没有被你赋值给新变量,原来的$bookingd仍然是完整的查询构造器实例。该实例内置了Eloquent模型关联、数据库连接实例、查询配置、递归关联属性等大量嵌套对象,print_r打印时会递归遍历输出所有层级的属性,数据量远超PHP默认内存限制,因此触发报错。
你单独执行SQL返回的结果集很小,和本次内存溢出没有关联。
解决方法
- 接收查询执行的返回结果,仅打印结果集即可
// 存储pluck返回的结果集合 $mechanicIds = $bookingd->groupBy('mechanic_id')->pluck('mechanic_id'); // 打印结果数组,数据量极小不会触发内存问题 print_r($mechanicIds->toArray());
- 如果需要调试查询构造器对应的SQL,直接用Laravel提供的专用方法,避免打印整个对象
// 获取待执行的SQL语句 $sql = $bookingd->toSql(); // 获取SQL的绑定参数 $bindings = $bookingd->getBindings(); var_dump($sql, $bindings);
- 临时调试场景可临时调高PHP内存限制,该方案不建议在线上环境使用
// 临时将内存上限调整为1G,按需调整数值即可 ini_set('memory_limit', '1G'); print_r($bookingd, true);
内容的提问来源于stack exchange,提问作者Prashant Soam
相关产品推荐
相关产品推荐

