Relación de muchos a muchos (N:M)

edited abril 2012 in Dudas/Problemas
Hola,

Tengo un problema mapeando una relación N:M, mis tablas son:

  1. perfil
  2. modulo
  3. modulo_perfil

Donde modulo_perfil es la tabla intermedia con las id de las otras tablas la cual me permite manejar esta relación que es: Un perfil puede tener muchos módulos y un módulo puede estar en muchos perfiles.

Eso es precisamente lo que no se como codificar, he puesto en ambos modelos lo siguiente:

$this->has_and_belongs_to_many('perfil');  en el modelo Modulo
$this->has_and_belongs_to_many('modulo'); en el modelo Perfil

Pero allí no se que más hacer, he manejado Propel como ORM, y allí el manejo es muy simple, tanto que se pueden hacer cosas de este tipo:

$perfil = new Perfil("descripcion del perfil");
$perfil->addModulo( new Modulo("nombre del modulo") );

Y automáticamente se almacenan los datos en las tres tablas correspondientes.

Para obtener los módulos de un perfil debería ser posible hacer esto:

$perfiles = Load::model('Perfil')->find();

foreach( $perfiles as $perfil ){
$modulos = $perfil->getModulos();
....
operaciones con los modulos de cada perfil, ya sea quitarlos o agregar nuevos...
....
}

La verdad no se si este framework tenga este nivel, he leído sobre una aplicación llamada treeGrid donde supuestamente hay algo similar, pero no la encuentro por ningún lado, la documentación es algo pobre en este aspecto.

Les agradecería muchísimo que me ayudaran con este problema, ya sea con algún ejemplo o sitio web porque realmente el framework me gusta.


Saludos

Comentarios

  • Ya logré hacer el mapeo N:M

    Para ello bajen la versión que hay de KumbiaPHP aquí: https://github.com/manuelj555/KumbiaPHP

    Es un fork hecho por un usuario quien a agregado mejoras a la parte de relaciones N:M con has_and_belongs_to_many

    Para mostrarles como se hace tomaré mi caso particular:

    Tengo dos tablas:
    1. modulos
    2. perfiles
    La relación que existe entre ellas es la siguiente:

    Un perfil puede tener muchos módulos y un módulo puede estar en muchos perfiles.

    Para poder establecer esta relación es necesario crear una tabla intermedia, la tabla intermedia se llamará:
    1. perfil_modulo
    Como notan es el nombre de ambas tablas unidas por un "_"

    Ahora como ya saben, se deben crear los modelos: Perfil y Modulo los cuales heredan de ActiveRecord.

    Ahora si utilizamos la función: has_and_belongs_to_many de la siguiente manera:

    En este caso particular es el Perfil quien tiene modulos, entonces la función la ponemos dentro del modelo Perfil en la función initialize() asi:

    public function initialize(){
    $this->has_and_belongs_to_many('modulo');
    };
    Ya con esto tenemos las tablas relacionadas.


  • edited junio 2012
    Continuación ...


    Ahora es probable que en algún controlador, nos interese conocer los módulos que están asignados a un perfil para lo cual hacemos lo siguiente:
    //Cargamos un perfil con un id determinado
    $perfil = Load::model('perfil')->find($id);

    //Traemos los módulos asignados a este perfil
    $modulos = $perfil->getModulo();

    Y ya en la variable $modulos tenemos todos los módulos que fueron asociados a dicho perfil gracias a la función getModulo() que se crea dinámicamente con "get" y el nombre del otro modelo relacionado "Modulo".

    Haría falta unas funciones que a mi parecer serían útiles y es la capacidad de hacer:

    $perfil->addModulo($modulo)
    $perfil->removeModulo($modulo)

    Para permitir adicionarlos o removerlos de forma natural del perfil y que la inserción o eliminación en la tabla intermedia resulte transparente para el programador, hasta el momento lo he solucionado creando las funciónes manualmente en el modelo Perfil y actualizando la tabla intermedia con el callback after_save()

    Espero que les sea útil.

    Saludos.

  • edited noviembre 2012
    Hola estimados.

    Soy nuevo en Kumbia PHP y hasta ahora me ha gustado, se programar en php y he desarrollado varios sistemas, pero creo que es hora de estructurarse un poco, por lo que he decidido usar este maravilloso framework, pero tengo un problema con eso de las relaciones, tengo el mismo caso que tu y la misma relacion, pero no logro saber como usarla, la parte que dice "$modulos = $perfil->getModulo();" no se como implementarla, ya que me dice que le metodo Getmodulo() no se encuentra.

    me podrias orientar un poco, ya que he seguido tu ejemplo y no me ha podido funcionar.

    Saludos.
Sign In or Register to comment.