Relaciones múltiples

Para solucionar los casos de relaciones múltiples

Relacion 1..N

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)
Pantalla de Nuevo Libro

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:

Pantalla de Nuevo Libro

Dado que la opción por comentario "Empty" genera un option con value = "" y el campo fue definido como NOT NULL si no es seleccionado un autor y se deja la opción "-- Elija Autor--" al aceptar, producirá un error de validación del tipo "Este campo es obligatorio"

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

Tambien se aceptan opcionalmente las mismas configuraciones que en una relación normal y mantienen los mismos valores por defecto, en nuestro ejemplo valdrán:

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:

Pantalla de Nuevo Libro