// 方法1:直接使用 find()
$templateVersion = AssetTemplateVersionModel::find($this->template_id);
// 方法2:使用查询构造器
$templateVersion = AssetTemplateVersionModel::query()->find($this->template_id);
乍看之下,这两行代码似乎没有太大区别。然而,在处理大字段时,它们的内存表现却大不相同。 技术解析 Eloquent 模型的加载机制 Laravel 的 Eloquent ORM 在使用 find() 方法时,会: 1、立即加载模型的所有属性 2、将大字段(如大型 JSON 字符串)直接加载到内存 3、触发即时属性填充 相比之下,query() 方法: 延迟加载模型属性 1、只在真正访问字段时才加载数据 2、只在真正访问字段时才加载数据 3、提供更细粒度的数据获取控制
// 内存溢出示例
$templateVersion = AssetTemplateVersionModel::find($this->template_id);
$largeJsonString = $templateVersion->template; // 瞬间加载整个大字符串
当 template 字段包含数兆字节的 JSON 数据时,这种加载方式会瞬间消耗大量内存。
结论
本文为码上有钱原创文章,转载无需和我联系,但请注明来自码上有钱博客https://oldcai688.com
最新评论