使用Eloquent进行模型更新会导致内存不足

时间:2016-10-29 08:03:57

标签: laravel eloquent laravel-5.3

我正在尝试使用新描述更新我的项目模型,但是当执行ConsoleCommand时,它会抛出内存不足。如果我创建一个新项目模型,则没有问题。我怀疑它会尝试更新所有记录而不是我指出的项目。

val df = sqlContext.read
                  .format("elasticsearch")
                  .option("es.nodes", "node1.cluster1:9200")
                  .load("your_index/your_type")

df.write
    .option("es.nodes", "node2.cluster2:9200")
    .save("your_new_index/your_new_type")

PHP致命错误:第2710行的.. \ vendor \ illuminate \ support \ Str.php中允许的内存大小为134217728字节(试图分配65488字节)

PHP致命错误:第2710行的.. \ vendor \ illuminate \ support \ Str.php中允许的内存大小为134217728字节(试图分配65488字节)

$items = Item::query()->where('description', '=', '')->get();
foreach ($items as $item) {
    if ($item->exists()) {
        $item->description = "new description";
        $item->save();
   }
}

EDIT1:
这个问题集中在为什么$ item-> save()的调用导致内存不足。当只有一个模型试图保存/更新时。

EDIT2:
为什么以下代码仍会丢失内存?

count($items) = 3255
count($item) = 1

$items->count() = 3255
$item->count() = 3255

但不是在使用以下内容而不是 - > save():

$item = Item::where('description', '=', '')->first();
$item->description = "new description";
$item->save();

3 个答案:

答案 0 :(得分:1)

您正在查询所有项目,这就是您收到错误的原因。这就像将表中的所有数据复制到内存中一样。如果每行的描述不同,请尝试使用update()方法一个接一个地更新行:

foreach ($data as $row) {
    Item::where('description', 'old description')
        ->update(['description' => 'new desccription']);
}

不要忘记将description添加到$fillable数组。

如果由于某种原因您确实想使用save()而不是update(),则可以使用chunk()方法加载数据。

  

使用chunk方法将在处理大型结果集时节省内存

答案 1 :(得分:0)

您可以使用update()函数将单个查询中的多行更新为:

Item::where('description', '=', '')
    ->update(['description' => 'new description']);

答案 2 :(得分:-1)

不确定这是否有帮助,但我有完全相同的问题...这是因为模型I被称为"保存"没有主键。