Сохранение нескольких записей с помощью saveAll

November 30, 2008 | By admin | Filed in: CakePHP, Переводы.

Оригинал

При решении задачи, вынесенной в заголовок, одной из проблем является то, что результат вызова $this->SomeModel->find(‘all’); имеет следующий формат:

Array
(
    [0] => Array
        (
            [Profile] => Array
                (
                    [id] => 21
                    [name] => bob 3
                    [created] => 2008-10-27 13:01:30
                )

        )

    [1] => Array
        (
            [Profile] => Array
                (
                    [id] => 20
                    [name] => larry 5
                    [created] => 2008-10-27 13:01:30
                )

        )

Но для того, чтобы сохранить данные с использованием saveAll, структура должна быть следующей:

[Profile] => Array
        (
            [21] => Array
                (
                    [id] => 21
                    [name] => bob 3
                    [created] => 2008-10-27 13:01:30

                )

            [20] => Array
                (
                    [id] => 20
                    [name] => larry 5
                    [created] => 2008-10-27 13:01:30
                )

Видите разницу в структуре массива и ключей?

Есть простой способ получить нужную структуру с использованием метода Set::combine() (само собой, класса Set).

Для начала мы создаем действие для редактирования, помня о структуре, необходимой для saveAll():

function edit() {
if(!empty($this->data)) {
$this->Profile->saveAll($this->data['Profile']);
}
else {
$this->data['Profile'] = Set::combine($this->Profile->find('all'), '{n}.Profile.id', '{n}.Profile');
}
}

Мы используем Set::combine() для форматирования результата find(‘all’) и дальнейшего присваивания полученного массива свойству $this->data, которая будет использована хелпером Form.

Теперь нужно создать соответствующую форму:

echo $form->create('Profile', array('action'=>'edit'));

foreach($this->data['Profile'] as $key => $value) {
echo $form->input('Profile.'.$key.'.name');
echo $form->input('Profile.'.$key.'.id');
}

echo $form->end('Save All Profiles');

Данная форма позволяет переименовать несколько профилей одновременно. Она создается на основе массива $this->data как раз в том виде, который нужен для корректной работы метода saveAll() .


Tags: ,

Leave a Reply