Reputation: 1322
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
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.
http://book.cakephp.org/view/1487/Set
Upvotes: 4