Данные HABTM CakePHP не сохраняются в базе данных

У меня есть модель GenForm которой есть связь HABTM с другой моделью PdfFile . Я использую это для создания списка GenForm в моем GenForm индекса GenForm . В модели GenForm я добавил:

 public $hasAndBelongsToMany = array( 'PdfFile' => array( 'className' => 'PdfFile', 'joinTable' => 'gen_forms_x_pdf_files' ) 

Вот фрагмент моего представления GenForm index.ctp :

 <?php echo $this->Form->input( 'PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') ); echo $this->Form->input( 'first_name' ); echo $this->Form->input( 'last_name' ); ?> 

В контроллере у меня есть базовое сохранение:

  if ($this->request->is('post')) { // form was submitted $this->GenForm->create(); if ($this->GenForm->save($this->request->data)) { return $this->redirect(array('action' => 'generate', $this->GenForm->id)); // assemble the PDF for this record } else { $this->Session->setFlash(__('Log entry not saved.')); } } 

Теперь $this->data выглядит примерно так, когда я debug() это:

 array( 'PdfFile' => array( 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ) ), 'GenForm' => array( 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) ) 

Все работает отлично, но я не могу проверить флажки (по крайней мере один должен быть проверен). Итак, в соответствии с этим ответом я внес некоторые изменения.

Представление index.ctp стало:

 <?php echo $this->Form->input( 'GenForm.PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') ); echo $this->Form->input( 'first_name' ); echo $this->Form->input( 'last_name' ); ?> 

Вот мое правило проверки:

 public $validate = array( 'PdfFile' => array( 'rule' => array( 'multiple', array('min' => 1) ), 'message' => 'Please select one or more PDFs' ) ) 

Это то, что $this->data выглядит сейчас:

 array( 'GenForm' => array( 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ), 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) ) 

Теперь флажки для PdfFile проверяются, но данные PdfFile не сохраняются, хотя другие поля для GenForm корректно сохраняются в их собственной таблице.

Может ли кто-нибудь сказать мне, что мне не хватает, чтобы PdfFile автоматически PdfFile и получил подтверждение?

Первая форма права

Указание очевидного, но форма, которая сработала, – это форма использования, то есть:

 echo $this->Form->input('PdfFile', array( 'label' => 'Select some PDF files', 'multiple' => 'checkbox' )); 

Изменение формы для «поля» под названием «PdfFile» просто не сработает – поскольку слой модели удалит любые данные для полей, которые не существуют, и в этой форме он проверит gen_forms.PdfFile , найдет, что нет поле и игнорировать данные.

Проверка

Чтобы позаботиться об ошибках проверки, используйте правило проверки, запущенное на модели, которая проверяет количество записей habtm, которые будут сохранены. Не имеет значения, какое имя поля используется для проверки, например:

 <?php class GenForm extends AppModel { public $validate = array( 'dummy' => array( // <- name this whatever you like 'atLeastOne' => array( 'required' => true, // run always 'rule' => array('validateAtLeastOne') ) ) ); function validateAtLeastOne() { if (!isset($this->data['PdfFile'])) { // there is no pdf data at all, ignore this rule // allow other save operations to work return true; } $return = count(array_filter($this->data['PdfFile']['PdfFile'])); if (!$return) { $this->PdfFile->invalidate('PdfFile', 'Please upload a file'); } return $return; } } 

Поскольку правило проверки возвращает false, если нет записей, оно остановит сохранение. Вызвав invalidate в ассоциации HABTM с тем же именем поля, которое будет искать хелпер формы, появится сообщение об ошибке.

альтернативно

Вы можете использовать второй подход в вопросе:

 echo $this->Form->input('GenForm.PdfFile', array( 'label' => 'Select some PDF files', 'multiple' => 'checkbox' )); 

В полном понимании, что это не то, как торт ожидает получения данных, а затем манипулирует им как правильный формат в beforeValidate:

 <?php class GenForm extends AppModel { public $validate = array( 'PdfFile' => array( // existing rule ... ) ); function beforeValidate() { if (isset($this->data[$this->alias]['PdfFile'])) { // keep the existing data as that's what validation will check against // copy to the right location so Cake will process it $this->data['PdfFile']['PdfFile'] = $this->data[$this->alias]['PdfFile']; } return true; } ... } 

Если я правильно помню, из руководства по тортам, вероятно, вы неправильно форматируете данные.

Попробуйте, чтобы данные $this->data выглядели следующим образом:

 array( 'GenForm' => array( 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ), 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ), )