2011-05-04 5 views
7

Comment mettre à jour un seul champ de plusieurs enregistrements dans CakePHP?CakePHP - Comment mettre à jour plusieurs enregistrements

Je récupère plusieurs enregistrements en utilisant $this->Item->find('all') et j'ai besoin de définir des valeurs différentes pour chacun d'entre eux et enregistrer. Je ne

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

mais il génère une erreur en disant

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

Qu'est-ce que je fais mal?

Répondre

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 .

Essayez cette

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

Voir [@ réponse de hugofcampos] (http://stackoverflow.com/a/18255526/216084) pour la performance. –

+0

Avec l'introduction de [Model :: saveMany] (http://book.cakephp.org/2.0/fr/models/saving-your-data.html#model-savemany-array-data-null-array-options- array) dans CakePHP 2.0, référez-vous à la réponse de @ hugofcampos pour une meilleure approche à ce sujet. –

+0

@HamidNazari Je pense que ce ne sera pas bon s'il y a des milliers de champs c'est pas recommandé –

2

Ce que vous faites mal, c'est que $item n'est pas un Objet (ni items btw), donc vous ne pouvez pas appeler de méthode à ce sujet. $items est juste un tableau avec tous les résultats de votre opération find(). Vous devez utiliser la méthode saveAll() et l'utiliser sur un objet approprié, $this->Item dans ce cas.

Voir la partie inférieure de cette page de the documentation pour plus d'informations.

18

Je dirais que vous devriez utiliser CakePHP Save Many pour améliorer les performances.

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

Comment pouvons-nous utiliser saveMany dans CakePHP 3? –

Questions connexes