CakePHP hasAndBelogsToMany usando save () vs. saveAll ()
-
02-07-2019 - |
Pregunta
Estoy usando una base de datos muy intrínseca con una aplicación CakePHP y hasta ahora mis vistas y controladores de modelos múltiples funcionan bien. Tengo una tabla singular ( Entity
) que tiene su id
en varias otras tablas como la clave externa entity_id
Algunas tablas son relaciones uno a uno (como una Company
es una Entity
) y algunas son una a muchas ( Entity
pueden tener varias Addresses
) y así sucesivamente.
No quiero / no puedo cambiar el modelo de base de datos , así que esta es la estructura.
He estado usando saveAll ()
para guardar datos en esas tablas con nombres de entrada como:
Entity.type='x' (hidden inside the view)
Company.name
Address.0.street
Address.0.city
Address.1.street
Address.1.city
... and so on ...
y my save all está haciendo todo el trabajo duro, BEGIN TRANSACTION
, todos los INSERT
y un COMMIT
...
Pero ahora he creado una EntityCategory
que es una relación n a n y he creado la relación completa HABTM
dentro del modelo.
Funciona cuando save ()
pero solo la relación HABTM
, y guarda todo cuando uso saveAll ()
(solo como antes) excepto por la relación HABTM
.
¿Me estoy perdiendo algo? ¿Cómo hago para que esto funcione correctamente? Estoy usando el siguiente código hoy:
if (!empty($this->data)) {
$this->Entity->saveAll($this->data);
$this->Entity->save($this->data);
}
El saveAll ()
guarda todos los datos en varias tablas, guarda el id en Entity- > id
y el save ()
guarda las relaciones HABTM
, pero no estoy seguro de si es correcto o si me puede traer problemas si cambio alguna estructura / modelo.
¿Es esta la mejor manera de usarlo? ¿Hay alguna forma correcta de guardar esas relaciones dentro de CakePHP? ¿Qué me puede decir su experiencia / conocimiento?
Solución
Esto se soluciona si descarga nightly .
Tenga cuidado, sin embargo, algo más podría romperse.
Otros consejos
El problema con las asociaciones saveAll () y HABTM es un conocido CakePHP problema , y tiene no resuelto a partir de 1.2 RC2.
Tan rápido como las mejores prácticas para guardar datos de modelos relacionados, según CakePHP libro de cocina :
" Al trabajar con modelos asociados, es importante darse cuenta de que guardar los datos del modelo siempre debe hacerse con el modelo CakePHP correspondiente. Si está guardando una nueva publicación y sus comentarios asociados, entonces usaría los modelos de publicación y comentario durante la operación de guardar. & Quot;
Sin embargo, usar saveAll () y save () debería funcionar, y en mi humilde opinión es una solución más flexible / genérica.