sql >> Base de Datos >  >> RDS >> Mysql

CakePHP:la creación de una nueva fila HABTM en su lugar actualiza otra

Ok, esto es lo que pienso está pasando:

No estás usando la súper útil relación mágica HABTM. En lugar de tratar esta tabla como una mera tabla de relaciones, cake va al modelo definido y ve las relaciones que ha definido y las claves primarias y los campos de visualización, etc.

Eso está bien cuando tienes una tabla HABTM complicada. Pero si ese es el caso, su conjunto de datos está desordenado, porque no está agregando una Question y Qset por separado. Lo que quiero decir es que no estás haciendo

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

Al hacer eso, dejas que cake resuelva la asociación HABTM por ti, y esa estructura de datos estaría bien. Pero tiene su propio modelo QsetsQuestion en su carpeta de modelos. Entonces, los datos que guarde deberían ser como cualquier otra tabla, así

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

Y eso crea una nueva identificación en la tabla qsets_questions, con la nueva relación, tal como lo desea.

Sin embargo, tenga cuidado, ya que está usando su propio modelo para esto, si no configura sus validaciones correctamente, es posible que tenga el mismo par de claves externas muchas veces, porque por defecto, solo verifique que la identificación debe ser única. .

[EDITAR] Después de un poco de aclaración, la solución anterior resuelve el "problema", pero en realidad no es la razón de este comportamiento.

Cakephp tiene un característica

Entonces, cuando desea agregar una nueva fila, Cake elimina todas las asociaciones anteriores y agrega las nuevas. Una forma de resolver esto es encontrar todos los Qsets que pertenecen a una pregunta y agregarlos a los $data matriz (con la adición de la nueva asociación de preguntas que desea agregar). Este enlace me ayudó a comprender las asociaciones HABTM (busque "Desafío IV").

Sé que la solución que di antes te ayudó con el "problema", pero se hizo bajo la impresión de que tenías una QsetsQuestion archivo modelo en alguna parte. Como no lo hace, la solución sería obtener todas las Questions asociados y agregarlos como una nueva matriz. O en realidad crea un QsetsQuestion modelo, y haga las asociaciones como esta:

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

O cambiar el comportamiento de la torta... Ninguno de ellos parece bonito, lo sé.

Entonces, resumen de soluciones:

  • Cada vez que desee guardar una nueva asociación Qset-Question, recupere las asociaciones previamente almacenadas, colóquelas en la matriz para guardarlas y guárdelas

    //find previously associated Qsets, lets say it's 1,2,3 and 4
    $data = array('Question'=>array('id'=>1),
              'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
    $this->Question-save($data);
    

Tenga en cuenta que no hay QsetsQuestion , ya que no existe. Esta debería ser la primera opción ya que el modelo HABTM no es complejo

O

  • Crear QsetsQuestion en la carpeta de su modelo y cambie las asociaciones como se indica arriba. La parte de guardar en el controlador sería

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

Es mucho más simple (tal vez), pero debe crear un nuevo archivo y recordar verificar que no haya una asociación similar anterior (verifique si existen 2-2 tuplas antes de insertarlo). Las reglas de validación simples deberían funcionar.

O

  • Cambiar el comportamiento de cakephp para esto... No me gusta este.