Laravel中使用$with预加载模型关联时出现浏览器冻结超时问题
问题原因及解决办法
这是循环预加载引发的死循环。具体逻辑是:
- 当加载User模型时,因为设置了
protected $with = ['profile', 'subscription'];,会自动预加载关联的Profile - 而Profile模型又设置了
protected $with = ['user'];,加载Profile时会自动预加载关联的User - 接着这个User又会再次触发预加载Profile,如此无限循环下去,直到服务器资源被耗尽,最终导致浏览器冻结、请求超时。
解决办法
- 移除其中一个模型的自动预加载配置:比如删掉Profile模型里的
protected $with = ['user'];,之后在需要同时获取Profile和User数据的场景,手动使用with()方法加载,例如Profile::with('user')->find($id);。 - 如果业务上必须保留两边的自动预加载,可以在关联查询时通过
setEagerLoads([])临时禁用预加载,或者在关联定义中添加条件限制,但这种方式复杂度较高,更推荐第一种方案,既简单又能避免不必要的性能浪费。
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

