CakePHP - 如何更新多条记录

7

如何在CakePHP中更新多个记录的单个字段?

我使用$this->Item->find('all')检索多条记录,需要为每条记录设置不同的值并保存。我执行以下操作:

$items = $this->Item->find('all', array(
    'fields' => array('Item.id', 'Item.order'),
    'conditions'=> array(
        'Item.project_id =' => $this->request->params['project_id'],
    ),
    'order' => array ('Item.order ASC')
));

foreach($items as $key => $item) {
    $item->saveField('Item.order', rand(1, 10));
}

但是它会出现错误,提示如下:

致命错误:在非对象上调用saveField()函数

我做错了什么?

3个回答

18

我建议你使用 CakePHP Save Many 来提高性能。

例如:

$data = array(
    array( 'Item' => array('id' => 2, 'order' => rand(1,5)) ),
    array( 'Item' => array('id' => 3, 'order' => rand(1,5)) ),
);
$Model->saveMany($data, array('deep' => true));

CakePHP 3 中如何使用 saveMany() ? - kh.tab

9

更新:请注意,这是一个旧答案,适用于CakePHP 1.3。有关现代方法,请参阅下面的答案

尝试这个

foreach($items as $key => $item) {
    $this->Item->id = $item['Item']['id'];
    $this->Item->saveField('order', rand(1, 10));
}

2
请参考@hugofcampos的回答以获得性能方面的建议。 - user216084
随着CakePHP 2.0中Model::saveMany的引入,参考@hugofcampos的答案以获得更好的方法。 - Hamid Nazari
@HamidNazari 我认为如果有成千上万个字段,这将不是一个好的选择,不建议这样做。 - kh.tab

2
你做错了的地方是$item不是一个对象(items也不是),所以你不能在它上面调用任何方法。 $items只是一个包含来自find()操作的所有结果的数组。
你需要做的是使用saveAll()方法,并在一个正确的对象上使用它,例如$this->Item
有关更多信息,请参见文档底部的部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接