Relaciones múltiples
Para solucionar los casos de relaciones múltiples

Relaciones Múltiples N..M
La forma convencional de realizar una relación de muchos con muchos utilizando tablas relacionales es mediante una tabla intermedia que guarde las relaciones entre ellas. Preweb-Helper soporta de forma configurable este comportamiento. Dado que el mismo no se da en un campo propio de la tabla de nuestro módulo no podemos configurarlo desde la bd. Sin embargo si podemos mediante unas pocas líneas de código definir el comportamiento de la
relación para que luego pueda ser utilizada con facilidad. //En el index.php del módulo de libros
$relationConfig["relTable"] =
"ml_libroxgenero"; // Nombre de la tabla de la relación
$relationConfig["relLocalIdname"] = "id_ml_libro"; // Nombre del id local en esa tabla
$relationConfig["relForeignIdname"] ="id_ml_genero"; // Nombre del id foraneo en esa tabla
$relationConfig["nameTable"] = "ml_genero"; // Tabla foranea donde esta guardado el texto que debe mostrarse
$relationConfig["nameField"] = "nombre"; // Campo del texto a mostrar, puede ser una instrucción SQL ej: (SELECT nombre FROM ...)
$relationConfig["nameIdName"] = "id"; // Nombre del campo donde ser guarda el id en la tabla foranea
$relationConfig["delete"] = true; // En caso de deseleccionar un elemento debe eliminarse el registro en la tabla relTable?
$modelo->setMultipleRelationship("Generos",$relationConfig);
// Se setea en el modelo la relacion pasandole como parámetros el nombre que se utilizará y la configuración que hemos definido de la misma.
y solo poniendo el nombre del campo indicando que es una
relación bastará para que el helper, tanto modelo como vista, sepan
inteprearlo. Dado que en este caso se cumplen las configuraciones por
defecto (El texto en la tabla foránea es el campo "nombre", el id es el
campo "id" y no se muestra un mensaje vacio)
Si queremos agregar un mensaje del tipo "-- Elija Autor --" debemos agregar en el template algo como "[{345|Elija Autor}]" y definir la tabla de la siguiente manera
CREATE TABLE mlib_libro (
id bigint(20) NOT NULL auto_increment,
titulo varchar(50) NOT NULL character set utf8,
cant_paginas int NOT NULL,
id_ml_autor bigint NOT NULL
COMMENT 'empty:=-- [{345|}] --',
editorial bigint NOT NULL,
PRIMARY KEY (`id`)
)
y quedaría algo asi:
Relaciones 1..N por categorias
En nuestro ejemplo el módulo de editoriales es un módulo autocategorizado, es decir que los propios elementos pueden ser padres o hijos en la estructura, similar al módulo de contenidos. Evidentemente esto significa que dicho módulo tiene una estructura jerárquica y, además que tiene una relación consigo mismo.
Otros tipos de relaciones que no sean simples y directas no son detectadas por helper y deben ser indicadas desde otro lugar.
En este caso, para armar un selector ordenado por categorías debemos indicarlo mediante comentarios. Existe un tipo de campo llamado CatRelation que permite armar este tipo de selectores.
Por lo tanto debemos indicar en el comment "type:=CatRelation;" para decirle al helper que debe utilizar ese tipo de dato ignorando lo que hay en el Type de la tabla.
Luego, este campo necesita los siguientes parámetros
- tableRel: Es la tabla con la que nos vamos a relacionar. En nuestro ejemplo es "ml_editorial". Este campo es obligatorio suministrarlo
- idparentname: Es el nombre del campo donde se guarda la información de padre en la tabla foránea, por defecto es "padre" y en nuestro ejemplo también.
- self: Esta variable indica si debe aparecer el id actual en la jerarquía. Esto es para los casos de autocategorias en donde no queremos que un elemento se tenga como padre a si mismo. En el caso de la tabla ml_editorial en su relacion consigo mismo deberia ser false. En el caso de la tabla ml_libro en su relación con ml_editorial deberia ser true puesto que si ponemos false y estamos viendo el libro de id 5 nos quitará del selector a la editorial de id 5, que claramente no tiene nada que ver. Por defecto es false
- show:="nombre";
- idname:="id";
- empty:= "";
Por lo que no necesitaremos setearlos dado que son los valores por defecto. Finalmente nuestra tabla quedará:
CREATE TABLE mlib_libro (
id bigint(20) NOT NULL auto_increment,
titulo varchar(50) NOT NULL character set utf8,
cant_paginas int NOT NULL,
,
id_ml_autor bigint NOT NULL
COMMENT 'empty:=-- [{345|}] --'
editorial bigint NOT NULL COMMENT
'type:=CatRelation;tableRel:=ml_editorial;self:=1',
PRIMARY KEY (`id`)
)
Y tendremos un resultado como el siguiente:
