Cristina, porque no te mueves al foro de yii en español ? http://www.yiiframeworkenespanol.org ? ahi hay un foro y es mas facil por ahora responder por ahi ademas que la comunidad te puede dar buena guia tambien, toda en español y bien activa.
te explico en terminos de modelo de datos y cambiando el ejemplo madre-hijo por otro, Vehiculo Pieza:
[b]Vehiculo {idvehiculo, marca}
Pieza {idpieza, nombrepieza} [/b]
En este caso veras lo que he querido mostrarte durante el post: la existencia de una tabla intermedia, el hecho de que exista o no.
En el caso de madre-hijo, esa tabla intermedia no era necesaria, pero en este ejemplo si, porque una pieza puede estar sola sin ser requerida por un vehiculo y a su vez se requerida por uno o varios vehiculos.
VehiculoPieza {idvehiculo, idpieza, cantidad}
Una pieza puede ir en un vehiculo pero con una cantidad, cosa que se me hacia dificil explicar con el ejemplo madrehijo.
fijate, tu "no debes" volarte una pieza asi como asi…porque dejarias a "VehiculoPieza" apuntando a una pieza que no existe, para ello, en el modelo de datos (en mysql), creas un foreign key. Quiza tu duda esta en como funciona este.
CREATE TABLE IF NOT EXISTS `cruge`.`vehiculopieza` (
`idvehiculopieza` INT(11) NOT NULL ,
`idpieza` INT(11) NOT NULL ,
`idvehiculo` INT(11) NOT NULL ,
PRIMARY KEY (`idvehiculopieza`) ,
INDEX `fk_vehiculopieza_pieza` (`idpieza` ASC) ,
INDEX `fk_vehiculopieza_vehiculo1` (`idvehiculo` ASC) ,
CONSTRAINT `fk_vehiculopieza_pieza`
FOREIGN KEY (`idpieza` )
REFERENCES `cruge`.`pieza` (`idpieza` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_vehiculopieza_vehiculo1`
FOREIGN KEY (`idvehiculo` )
REFERENCES `cruge`.`vehiculo` (`idvehiculo` )
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Fijate en:
CONSTRAINT fk_vehiculopieza_pieza
FOREIGN KEY (`idpieza` )
REFERENCES `pieza` (`idpieza` )
ON DELETE RESTRICT
ON UPDATE NO ACTION,
Cuando la table vehiculopieza tiene un FK definido (fk_vehiculopieza_pieza) y que apunta a la tabla "pieza" (por eso dice: REFERENCES pieza
(idpieza
) ), eso hace que cuando alguien o algo quiera hacer un "delete * from pieza" entonces el MOTOR DE DATOS SABRA que PIEZA tiene en VEHICULOPIEZA una restriccion (Constraint) que le prohibe (ON DELETE RESTRICT) rasparse un registro de PIEZA si este esta referenciado en VEHICULOPIEZA.
Asi funciona el FOREIGN_KEY.
Ahora YII…es otro cosa…otro pastel de otra panaderia…y las personas tienden a pensar que con el CActiveRecord::relations() ya tienen el problema resuelto y listo…y eso no es asi:
Por ejemplo, si con Gii creas los los modelos para Vehiculo, Pieza y VehiculoPieza, veras lo siguiente:
VehiculoPieza.php
class Vehiculopieza extends CActiveRecord
{
....
public function relations()
{
return array(
'idpieza0' => array(self::BELONGS_TO, 'Pieza', 'idpieza'),
'idvehiculo0' => array(self::BELONGS_TO, 'Vehiculo', 'idvehiculo'),
);
}
}
Si te das cuenta GII (no yii), te ha ayudado a crear las relaciones para que tu puedas navegar por ellas en YII…pero nada mas.
Si te fijas en la tabla Pieza.php, veras que hace una relacion hacia "vehiculopiezas", se usaria asi:
<?php
class Pieza extends CActiveRecord
{
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'vehiculopiezas' => array(self::HAS_MANY, 'Vehiculopieza', 'idpieza'),
);
}
}
Esto ultimo te permitiria navegar en Yii por las Asignaciones de Esta Pieza que se hicieron a un Vehiculo:
// listas las asignaciones de cada pieza:
$piezaSelec = Pieza::model()->findByAttribuyes(array('idpieza'=>'123'));
foreach($piezaSelec->vehiculopiezas as $vehiculopiezarecord){
echo "pieza asignada a ".$vehiculopiezarecord->idvehiculo
.", en cantidad: ".$vehiculopiezarecord->cantidad
.", y el nombre del vehiculo es: ".$vehiculopiezarecord->idvehiculo0->marca;
// nota que : $vehiculopiezarecord->idvehiculo0, es el apuntador al objeto Vehiculo que Yii ha cargado para ti para ser accedido mediante la relacion.
}
nota que : $vehiculopiezarecord->idvehiculo0, es el apuntador al objeto Vehiculo que Yii ha cargado para ti para ser accedido mediante la relacion, por tanto y como habras de suponer, $vehiculopiezarecord->idvehiculo0 es la relacion definida mas arriba bajo el array key ‘idvehiculo0’,
esto se puede interpretar asi (tomado de VehiculoPieza.php mas arriba):
‘idvehiculo0’ => array(self::BELONGS_TO, ‘Vehiculo’, ‘idvehiculo’),
indica que:
dispones de un atributo virtual llamado: idvehiculo0 , accesible mediante: $vehiculoPiezaInst->idvehiculo0
que, apunta a (BELONGS_TO) a un objeto de instancia de "Vehiculo", que previamente fue buscado por YII mediante el atributo: "idvehiculo".
Yii hizo esto por ti por debajo cuando invocaste a "idvehiculo0":
"select * from VEHICULO where IDVEHICULO = ".$this->idvehiculo;