Alex
Alex

Reputation: 1322

Update fields from an array with CakePHP

I have an array that is sent to my controller, such as this:

$array = array(
        [0]=>array(
             [id]=>5,
             [position]=>6 
        ),
       [1]=>array(
             [id]=>8,
             [position]=>2 
        )
);

And I need to save the position of each item using its id. What is the best way to do this in cakePHP? I can only imagine looping an update function or pulling the entire database, changing the correct values, then saving the database. Both ideas seem very bodged.

Upvotes: 2

Views: 3198

Answers (2)

OpenSorceress
OpenSorceress

Reputation: 2014

Ha, Cake magic to the rescue again. You don't have to tell Cake to save it by id. There's a big long amazing way Cake does this, but the short and skinny is -

if your array contains an 'id' key, Cake presumes it is the table primary key and generates an UPDATE statement instead of an INSERT. Looks like this:

UPDATE table as Table SET Table.position = $position WHERE Table.id = $id;

And, Cake knows to iterate for you if you use saveAll() instead of save():

$this->Model->saveAll($array);

If you have any save callbacks in your model, such as beforeSave(), you have to call them manually before calling saveAll() - they only autofire on save(), not saveAll() or updateAll().

You'll want to top your array with the name of your model ($array['Model'][0], $array['Model'][1], etc). If you need to magically saveAll() with multiple models, you top your array with indexed keys, then model names - like $array[0]['Model1'], $array[0]['Model2']) and Cake knows to save / update the associated data for all the models in each index batch.

Cake does ALL the legwork for you:

http://book.cakephp.org/view/1031/Saving-Your-Data - especially the saveAll() entry.

  • Edit - and topping your array with your model name? Cake makes that ridiculously easy, too. Check out Cake's built-in Set library for all your array / object manipulation needs.

http://book.cakephp.org/view/1487/Set

Upvotes: 4

Dave
Dave

Reputation: 29121

Have you tried CakePHP's saveAll() ? Details here.

Upvotes: 2

Related Questions