На странице редактирования для тестового теста модели я хочу обновить поле «Вопросы.Размер» на всех связанных с ним (по hasMany) вопросах из той же формы.
Я подготовил главу книги Cake о файле saveMany () / saveAll () в книге, и я использую Model.0.field syntax
но я не могу понять, как сообщить CakePHP, какая запись соответствует тому, какой вход , Если поле #
в Model.#.field
Соответствует полю id вопроса? Вот что я сейчас делаю:
echo $this->Form->create( 'Question', array('action'=>'order')); $n = 0; foreach ($questions_array as $question) : ?> <?php echo $this->Form->input('Question.'.$n.'.order' ); ?> <?php echo $this->Form->input('Question.'.$n.'.id', array('type'=>'hidden', 'value'=>$question['Question']['id']) ); ?> <input type="submit" value="Save" /> ... $n++; endforeach; $this->Question->Form->end();
Форма отправляется и появляется для сохранения, но обновленные значения order
не соответствуют правильным записям вопроса. Что я делаю не так?
Обновление :
Вот order
действий в моем контроллере:
public function admin_order() { $data = $this->request->data; $this->Question->saveAll($data['Question']); $this->Session->setFlash( "Order saved."); $this->redirect( $this->referer() ); }
CakePHP связывает все поля с одним и тем же «индексом» как единую «запись» в вашей базе данных. «Индекс» (т. Foo.0.id
0
в Foo.0.id
) не имеет никакого отношения к «id» записи, это просто число.
Например;
Foo.0.id = 123 Foo.0.name = 'hello'; Foo.1.id = 124 Foo.1.name = 'world';
Как уже упоминалось в начале моего ответа, сам индекс не имеет значения, этот код будет делать то же самое:
Foo.12345.id = 123 Foo.12345.name = 'hello'; Foo.54321.id = 124 Foo.54321.name = 'world';
Пока поля одной и той же записи имеют одинаковый «индекс», CakePHP поймет, что они принадлежат «вместе».
При отправке этих данных и их сохранении;
$this->Foo->saveMany($this->data['Foo']); // Just $this->data will probably work as well
CakePHP обновляет две строки с помощью модели Foo
;
таблица 'foos';
id name ------------------------ 123 hello 124 world
Кажется, что ваш код использует один и тот же идентификатор ( $qset['Qset']['id']
) для каждой строки, что, вероятно, не является правильным ID для обновления этих записей
As we can see at CakePHP Book, the instruction is: // Create: id isn't set or is null $this->Recipe->create(); $this->Recipe->save($this->request->data); // **Update**: id is set to a numerical value $this->Recipe->id = 2; $this->Recipe->save($this->request->data);
Учитывая, что есть еще люди, которые ищут этот ответ в 2014 году, вы должны использовать в
Вид : / * (с учетом счетчика $ n) * /
$ This-> вход ( 'Вопрос.' $ П.. 'Порядок.');
$ This-> вход (… 'Вопрос' $ п. ID ');
Контроллер : $ this-> Question-> updateAll -> ($ this-> request-> data ['Question']);