2011-05-04 40 views
7

¿Cómo puedo actualizar un solo campo de registros múltiples en CakePHP?CakePHP - Cómo actualizar registros múltiples

Recupero múltiples registros usando $this->Item->find('all') y necesito establecer valores diferentes para cada uno de ellos y guardarlos. Hago

$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)); 
} 

pero plantea un error diciendo

Fatal error: Call to a member function saveField() on a non-object

¿Qué estoy haciendo mal?

Respuesta

9

Update: Please note that this is an old answer meant for CakePHP 1.3. For a modern approach please refer to the answer below .

probar este

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

Ver [@ respuesta de hugofcampos] (http://stackoverflow.com/a/18255526/216084) para el rendimiento. –

+0

Con la introducción de [Model :: saveMany] (http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options- array) en CakePHP 2.0, consulte la respuesta de @ hugofcampos para un mejor acercamiento a esto. –

+0

@HamidNazari Creo que esto no será bueno si hay miles de campos no es recomendable –

2

Lo que está haciendo mal es que $item no es un objeto (ni es items btw), por lo que no puede llamar a ningún método al respecto. $items es solo una matriz con todos los resultados de su operación find().

Lo que debe hacer es utilizar el método saveAll() y usarlo en un objeto adecuado, $this->Item en este caso.

Consulte la parte inferior de esta página en the documentation para obtener más información.

18

diría que se debe utilizar CakePHP Save Many para mejorar el rendimiento.

Ex:

$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)); 
+0

¿Cómo podemos usar saveMany en CakePHP 3? –

Cuestiones relacionadas