ppazos / yupp

Automatically exported from code.google.com/p/yupp
0 stars 0 forks source link

Error al pedir por deleted=true objetos con MTI #110

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Tengo una clase Module con 2 subclases. Cuando pido las instancias de Module 
que están eliminadas lógicamente, el enganche de los registros de MTI en una 
sola instancia se hace mal, porque hay una confusión en los identificadores.

En la base tengo:

tabla_modules: registro con id=4, deleted=1
tabla_html_modules: registro con id=3, super_id_module=1, deleted=1

La consulta:

$tableName = YuppConventions::tableName( 'Module' );
$cond = Condition::EQ($tableName, 'deleted', true);
$deleted = Module::findBy( $cond, $this->params );

El log:

SELECT *
FROM cms_module
WHERE (
  (cms_module.class='HTMLModule' OR
   cms_module.class='MenuModule' OR
   cms_module.class='HTMLModule' OR
   cms_module.class='MenuModule' OR
   cms_module.class='Module')
 AND cms_module.deleted=1)
ORDER BY id asc LIMIT 50 OFFSET 0

SELECT * FROM cms_html_module WHERE id=4

SELECT * FROM cms_module WHERE id=5

En lugar de tomar de cms_module el registro con id=4, toma el registro con id=4 
pero de la tabla de la superclase cms_html_module, y cuando va a hacer el 
enganche, ese registro tiene super_id_module=5, o sea que termina cargando otro 
módulo.

Original issue reported on code.google.com by pablo.swp@gmail.com on 23 May 2011 at 4:18

GoogleCodeExporter commented 8 years ago
El problema se da en PM linea 1584:

$persistentClass = $row['class']; // soporte de herencia!!!!

Donde en lugar de usar la clase por la que se consulta (en este caso la 
superclase), se usa la subclase específica (que se carga de la base). El tema 
que el id corresponde a la superclase, no a las subclase, por eso hace problema.

El problema que quiero resolver es ¿cómo hacer para que sin saber la clase 
específica, pero sabiendo la subclase (Module) y su identificador (el de la 
superclase o el de la subclase), pueda obtener la instancia completa que 
necesito?

1. Si busco por el id de la subclase, necesito decirle de alguna forma cuál es 
la subclase específica, sino, no sabe en qué tabla buscar. Esto es porque la 
tabla de la superclase (Module) no tiene referencia al id de las subclases.

2. Si busco por el id de la superclase y por la clase de la superclase (esta la 
tengo porque es la superclase de todas las subclases, o sea la raíz de la 
estructura de herencia), debería hacer una consulta para obtener cuál es la 
subclase específica. Con esa subclase y el id de la superclase, busco en la 
tabla de la subclase, no por el id de la subclase, si no por el 
super_id_superclase.

Original comment by pablo.swp@gmail.com on 25 May 2011 at 2:54

GoogleCodeExporter commented 8 years ago
Era problema de programación, no del framework. Lo doy por cerrado.

Original comment by pablo.swp@gmail.com on 31 May 2011 at 4:14