Duda Basica Relacion Many_Many

Saludos a todos!!

Estoy iniciando con Yii, me siento muy contento pero me encuentro con una duda que muchos han solucionado pero no se como llevarla a cabo en su mejor practica!!.

Tengo el modelo en adjunto

son solo 3 tablas basicas para entenderlo rapido, no puedo insertar la imagen por ser mi primer post.

Mi pregunta es como alimentar la tabla del medio con la mejor practica?, hasta el momento solo he creado el modelo de Docente y de Materia teniendo la relacion asi:

Docente.php

‘materias’ => array(self::MANY_MANY, ‘Materia’, ‘docente_materia(docenteid, materiaid)’),

Materia.php

‘docentes’ => array(self::MANY_MANY, ‘Docente’, ‘docente_materia(materiaid, docenteid)’),

Cual es la mejor practica para llenarla? :rolleyes:

Lograrlo usando Yii puro es bastante complicado y yo no he podido lograrlo todavía. Sin embargo la extensión EAdvancedArBehavior funciona muy bien y lo hace transparente. Chequéala.

Suerte,

Así sin más no puedes.

Ten en cuenta que 1 relación MANY_MANY es equivalente a 2 relaciones HAS_MANY, con lo que tendrías que generar más código.

Tal y como lo pones en el post desde docente puedes acceder a los datos de docente y a los datos de materia a través de la relación, que indica sobre que campos debe hacer los left joins, pero fijate que ningún modelo sabe que campos hay en esa tabla intermedia, por lo que no vas a modificar nada.

Este es el comportamiento normal cuando la tabla intermedia solamente relaciona ambas tablas.

Si guardas datos alternativos necesitas crear el modelo de la tabla intermedia y crear las relaciones has many en los modelos docente y materia.

Claro que si solo se va a utilizar como un histórico y desde un único sitio, a veces con una función en 1 modelo y el query builder es suficiente.

Hola Amigo, antes que nada gracias por tu respuesta, haber si entendi.

  1. Debo crear la relacion self::HAS_MANY en los modelos docente y materia.

  2. Crear modelo tabla intermedia.

Estas relaciones las puso automaticamente el Gii (many many), entonces debo cambiarle la relacion y ajustar el formulario para que en el formulario de Materia pida o muestre el campo foraneo de la tabla Docente (y viceversa) y crear una funcion (transaccion) en el controlador con de Docente y Materia para que guarden en la tabla intermedia?, es esto lo que me tratas de decir?

(La tabla intermedia tiene update en cascade, no se si deba quitarla para esto)

Hola Amigo!, gracias por tu respuesta pero tengo una duda haber si te entendi.

Mirando la extension veo que la relacion como la genera el Gii sirve porque esta many_many pero no entiendo esto que esta en la doc de la extension.

No se que poner en $criteria teniendo en cuenta que en el ejemplo $projects es el alias de la relacion donde hay llaves compuestas, por otra parte asumo que el $user->save() guarda en la tabla intermedia cierto?, esto lo pongo en el actionCreate y en el actionUpdate?, cual es la mejor practica para esto segun tu experiencia.

Gracias de antemano por tu respuesta.

Un error mio, 1 relación MANY_MANY es equivalente a HAS_MANY + BELONGS_TO y no 2 HAS_MANY como dije antes.

  1. No necesitas crear ninguna relación más, con la MANY_MANY es suficiente.

  2. Si la tabla intermedia no tiene datos y solo actúa de pivote tampoco lo necesitas.

De esta manera la tabla intermedia la alimentas directamente, tienes que crear el insert.

La extensión que te facilita JFReyes si hace la inserción pero Yii por si solo no.

El mejor método dependerá de lo compleja que sea esa tabla intermedia, si aquí quieres más datos ahora tienes la opción de crear el modelo, es menos eficiente pero mucho más cómodo ya que incluye la validación de datos,…

Aquí una inserción simple con modelo, pero para esto yo no suelo utilizarlo,

con modelo

$criteria es una instancia de CDbCriteria que contiene los criterios para encontrar los récords del modelo Project que se van a conectar con el modelo User, i.e. los proyectos del usuario.

Hola amigo, finalmente lo hice asi!!

Ahora en el formulario de Docente puse esto:

Finalmente me gustaria saber si se recomienda usar transacciones para esto?

Me alegro que hayas encontrado la solución. :)

Hasta ahora no he tenido necesidad de usar transacciones Yii en mis proyectos porque ActiveRecord es de por sí bastante confiable. Me imagino que serían apropriadas para transacciones que actualicen 3 o más tablas de manera compleja. Por ejemplo, al crear una factura (tablas maestra-detalle) que además actualice la tabla de inventario y el historial del cliente.

Hola amigo, monitoreando en linux la bd y depurando el php (me gustan las cosas muy pulidas) me doy cuenta que hay sobrecarga de clases y que la bd hace tres cargas o movimientos extraños, pues revisando la extension en su codigo (manejo php nativo pero no frameworks jejeje) y luego de dedicarle toda una tarde descubro que la forma optimizada para esta extension no es como esta en la doc,

La perfecta es asi:

Lo demas… es repetir instancias y recorridos a la BD!! jejeje :D