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():
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'], $array['Model'], etc). If you need to magically saveAll() with multiple models, you top your array with indexed keys, then model names - like $array['Model1'], $array['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.