2013-04-21 2 views
4

На странице редактирования модели Test Я хочу обновить поле «Вопросы.Размер» на всех связанных с ним (по hasMany) вопросах из той же формы.CakePHP: Как обновить несколько записей одновременно с помощью хелпера формы

Я готов, Cake book chapter on 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 значения не соответствует правильному вопросу записи. Что я делаю не так?

Update:

Вот order действия в моем контроллере:

public function admin_order() { 
    $data = $this->request->data; 
    $this->Question->saveAll($data['Question']); 
    $this->Session->setFlash("Order saved."); 
    $this->redirect($this->referer()); 
} 
+1

Вы увеличиваете $ n? – Dave

+1

Что такое "Qset" и как он вписывается в ваш описываемый вопрос? – Dave

+0

У Дэйва есть хорошие вопросы, также я вижу, что ваша форма содержит кнопку «отправить» на * каждой строке * (это не должно быть проблемой, просто заметили ее). Не могли бы вы изменить свой вопрос и добавить свой код контроллера, чтобы посмотреть, как вы сохраняете свои данные. – thaJeztah

ответ

4

CakePHP связывает все поля с одинаковым индексом «», чтобы быть единой «запись» в базе данных. «Индекс» (то есть 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'; 

Пока полей же записи есть тот же 'index', 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 обновить эти записи

+0

После рассмотрения вашего ответа и моего кода я до сих пор не понимаю, как/почему CakePHP знает, какое значение назначить для ввода $ this-> Form-> («Вопрос. '. $ n.'. order '); «Я понимаю, что' $ n' используется для «пакетных» входов в отдельные записи, но как CakePHP знает, какая строка в базе данных соответствует '$ n'? – emersonthis

+0

@ Эмерсон знает, какая запись обновляется на основе поля 'id'; 'Foo.0.id = 123' и' Foo.0.name = 'hello'' будут делать что-то вроде 'UPDATE foos SET name =' hello 'WHERE id = 123;' – thaJeztah

+0

Я сделал эксперимент. Я добавил '' значение '=> $ question [' Question '] [' order '] 'в массив параметров для ввода, и теперь все значения отображаются правильно. Не уверен, почему это изменило ситуацию. – emersonthis

0
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 году Вы должны использовать в
View:/* (с учетом счетчика $ n) */
$ this- > Вход ('Вопрос.' $ П.. 'Порядок.');
$ this-> input ('Question.'. $ N. '.Я бы');
Контролер: $ this-> Question-> updateAll -> ($ this-> request-> data ['Question']);