Laravel 模型更新导致内存不足
我试图用新的描述更新我的项目模型,但是当执行ConsoleCommand时,它会抛出内存不足的错误。如果我创建了一个新的项目模型,就没有问题了。我怀疑它试图更新所有记录,而不是我指出的项目Laravel 模型更新导致内存不足,laravel,eloquent,laravel-5.3,Laravel,Eloquent,Laravel 5.3,我试图用新的描述更新我的项目模型,但是当执行ConsoleCommand时,它会抛出内存不足的错误。如果我创建了一个新的项目模型,就没有问题了。我怀疑它试图更新所有记录,而不是我指出的项目 $items = Item::query()->where('description', '=', '')->get(); foreach ($items as $item) { if ($item->exists()) { $item->description
$items = Item::query()->where('description', '=', '')->get();
foreach ($items as $item) {
if ($item->exists()) {
$item->description = "new description";
$item->save();
}
}
PHP致命错误:第2710行的..\vendor\illumb\support\Str.PHP中允许的内存大小为134217728字节(尝试分配65488字节)
count($items) = 3255
count($item) = 1
$items->count() = 3255
$item->count() = 3255
PHP致命错误:第2710行的..\vendor\illumb\support\Str.PHP中允许的内存大小为134217728字节(尝试分配65488字节)
count($items) = 3255
count($item) = 1
$items->count() = 3255
$item->count() = 3255
EDIT1:这个问题集中在为什么$item->save()的调用会导致内存不足。仅尝试保存/更新一个模型时 EDIT2:
为什么下面的代码仍然会抛出内存不足
$item = Item::where('description', '=', '')->first();
$item->description = "new description";
$item->save();
但当使用以下命令而不是->save()时,则不会:
您正在查询所有项目,因此会出现错误。这就像将表中的所有数据复制到内存中一样。如果每行中的描述不同,请尝试使用
update()
方法逐个更新行:
foreach ($data as $row) {
Item::where('description', 'old description')
->update(['description' => 'new desccription']);
}
不要忘记向数组中添加description
如果出于某种原因确实希望使用save()
而不是update()
,则可以使用方法加载数据
在处理大型结果集时,使用chunk方法将节省内存
您正在查询所有项目,因此会出现错误。这就像将表中的所有数据复制到内存中一样。如果每行中的描述不同,请尝试使用
update()
方法逐个更新行:
foreach ($data as $row) {
Item::where('description', 'old description')
->update(['description' => 'new desccription']);
}
不要忘记向数组中添加description
如果出于某种原因确实希望使用save()
而不是update()
,则可以使用方法加载数据
在处理大型结果集时,使用chunk方法将节省内存
您可以使用update()
函数在单个查询中更新多行,如下所示:
Item::where('description', '=', '')
->update(['description' => 'new description']);
您可以使用update()
函数在单个查询中更新多行,如下所示:
Item::where('description', '=', '')
->update(['description' => 'new description']);
不确定这是否有帮助,但我有完全相同的问题。。。这是因为我使用的名为“save”的型号没有主键。不确定这是否有帮助,但我遇到了完全相同的问题。。。这是因为我在其上被称为“save”的型号没有主键。如果没有save功能,console命令不会抱怨内存不足。此外,我要求该项从其他地方检索描述,因此如果我使用查询生成器直接更新,我将失去这样做的可能性。@user2803086,那么您的查询将占用大量内存,但不是全部。无论如何,你应该改变方法。我同意,但我不想失去太多的ORM功能。这似乎是一种奇怪的行为,为什么save()可能试图保存所有的$items,而不是我调用它的某个$items。@user2803086,如果出于某种原因您确实想使用
save()
而不是update()
,您可以这样做。但是您应该逐行获取数据。它将使查询数量增加一倍,但它比当前的方法要好得多。如果行太多,可以使用chunk()
方法加载数据:谢谢,但更多的是了解save()方法。正如您在EDIT2中看到的那样。我假设只更新这个项目,但是仍然会抛出内存不足,为什么,会发生什么?如果没有save函数,console命令不会抱怨内存不足。此外,我要求该项从其他地方检索描述,因此如果我使用查询生成器直接更新,我将失去这样做的可能性。@user2803086,那么您的查询将占用大量内存,但不是全部。无论如何,你应该改变方法。我同意,但我不想失去太多的ORM功能。这似乎是一种奇怪的行为,为什么save()可能试图保存所有的$items,而不是我调用它的某个$items。@user2803086,如果出于某种原因您确实想使用save()
而不是update()
,您可以这样做。但是您应该逐行获取数据。它将使查询数量增加一倍,但它比当前的方法要好得多。如果行太多,可以使用chunk()
方法加载数据:谢谢,但更多的是了解save()方法。正如您在EDIT2中看到的那样。我假设只更新此项,但仍会抛出内存不足,为什么,会发生什么?如果出现潜在的其他问题,您应该包括您的项
模型类如果出现潜在的其他问题,您应该包括项
模型类