Guardar selección múltiple en entrada

Tengo un modelo para

  • usuario (id, nombre)
  • sección (id, nombre)
  • section_users (id, user_id, section_id)

El administrador agrega todos los usuarios y secciones por separado. Una vez que se agreguen las tesis, quiero que el administrador seleccione la sección y agregue todos los usuarios en ella en la sección de usuarios.


Tengo una entrada seleccionada con múltiples configurados en verdadero. ¿Cómo guardo estos datos? El camino cakephp junto con la validación.

Form->input("section_id"); ?> Form->input("user_id", array('multiple'=>'checkbox')); ?> 

Esto genera

 Array ( [section_id] => 1 [user_id] => Array ( [0] => 3 [1] => 4 ) ) 

Sé que puedo hacer un bucle y convertirme a esto y usar saveAll o saveMany, pero cuál es la forma correcta / correcta de hacerlo.

 Array ( [0] => Array ( [section_id] => 1 [user_id] => 3 ) [1] => Array ( [section_id] => 1 [user_id] => 4 ) ) 

    Como ya se mencionó, esto se explica en los documentos, léelos y, en caso de que no los comprenda (lo cual sería comprensible ya que la sección HABTM es un poco confusa y requiere un poco de prueba y error), díganos qué es exactamente lo que están teniendo problemas con.

    http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm

    Según los ejemplos que se muestran, el formato para guardar múltiples X a Y debe ser

     Array ( [Section] => Array ( [id] => 1 ) [User] => Array ( [User] => Array(3, 4) ) ) 

    El formulario correspondiente podría verse así:

     Form->create('User'); ?> Form->input('Section.id'); ?> Form->input('User', array('multiple' => 'checkbox')); ?> Form->end('Add Users'); ?> 

    Y los datos se guardarían a través del modelo de Section , de esa manera su columna modified se está actualizando correctamente.

     public function addUsersToSection($id) { // ... if($this->request->is('post')) { if($this->Section->save($this->request->data)) { // ... } else { // ... } } else { $options = array( 'conditions' => array( 'Section.' . $this->Section->primaryKey => $id ) ); $this->request->data = $this->Section->find('first', $options); } $users = $this->Section->User->find('list'); $this->set(compact('users')); } 

    Otra forma sería reestructurar la matriz como lo muestra Vinay Aggarwal, que funciona bien, la única diferencia es que requiere guardar a través del modelo de unión y, en consecuencia, no actualiza la columna modified modelos de Section .

    CakePHP tiene la función saveMany , como se menciona en la documentación :

     Model::saveMany(array $data = null, array $options = array())¶ 

    Esta es la relación HABTM , antes que nada necesitas tener una relación de configuración en el modelo de SectionUser . Luego puede usar el método saveAll() para guardar todos los registros a la vez.

     Array ( [0] => Array ( [user_id] => 33 [section_id] => 9 ) [1] => Array ( [user_id] => 33 [section_id] => 10 ) ) 

    Asegúrese de que su matriz de datos esté en el formato anterior.

     $this->SectionUser->saveAll($data);