CakePHP-如何更新多个记录

CakePHP-如何更新多个记录,php,cakephp,Php,Cakephp,如何在CakePHP中更新包含多条记录的单个字段 我使用$this->Item->find('all')检索多个记录,我需要为每个记录设置不同的值并保存。我知道 $items = $this->Item->find('all', array( 'fields' => array('Item.id', 'Item.order'), 'conditions'=> array( 'Item.project_id =' => $this-&g

如何在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()


我做错了什么?

你做错了的是,
$item
不是对象(也不是
items
顺便说一句),所以你不能在此调用任何方法
$items
只是一个数组,其中包含
find()
操作的所有结果

您需要做的是使用
saveAll()
方法,并在适当的对象上使用它,在这种情况下,
$this->Item

有关更多信息,请参阅本页的底部

更新:请注意,这是一个针对CakePHP 1.3的旧答案。有关现代方法,请参阅

试试这个

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

我想说,你应该用它来提高性能

例:


有关性能,请参阅。随着CakePHP 2.0中的介绍,请参阅@hugofcampos的答案,以获得更好的方法。@HamidNazari我认为如果没有数千个字段,这将不好。我们如何在CakePHP 3中使用saveMany?
$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));