Ayuda Con Relaciones De Tablas.

Hola buen dia, miren estoy haciendo las relaciones de unas tablas, el la base de datos tengo las relaciones de la siguiente manera

(Imagen adjunta)

necesito desplegar los siguientes campos en el Grid: CLAVECCT, NOMBRECT, DOMICILIO, NOMBREMUN, NOMBRELOC, NIVEL, STATUS, para esto necesito tengo las siguientes relaciones:

class ModelPcEscuelasDetalle extends CActiveRecord{

public function relations()

{

return array(


	'fk_actba' => array(self::HAS_ONE, 'ModelACtba', 'CLAVECCT'),


	'fk_municipio' => array(self::HAS_ONE, 'ModelMunicipios', array('MUNICIPIO'=>'MUNICIPIO'), 'through'=>'fk_actba'),


	'fk_localidad' => array(self::HAS_ONE, 'ModelAItba', array('MUNICIPIO'=>'MUNICIPIO', 'LOCALIDAD'=>'LOCALIDAD'),'through'=>'fk_actba'),

/* ‘fk_inmueble’ => array(self::HAS_ONE, ‘ModelCctInmueb’,‘CLAVECCT’),

	'fk_nivel' => array(self::HAS_ONE, 'ModelNivelEd', array('CVENIVEL'=>'CVENIVEL'),'through'=>'fk_inmueble'),*/			


	);

}

}

El problema que tengo es que no puedo hacer la ultima relacion la que tengo comentado el de ‘fk_inmueble’ y el de ‘fk_nivel’ esto es por que me marca un error de que no puedo apuntar dos veces ‘CLAVECCT’ al modelo ‘ModelPcEscuelasDetalle’ por que la ‘fk_actba’ ya lo apunta e intentado la siguiente opcion

‘fk_inmueble’ => array(self::HAS_ONE, ‘ModelCctInmueb’,array(‘CLAVECCT’=>‘CLAVECCT’),‘through’=>‘fk_actba’),

‘fk_nivel’ => array(self::HAS_ONE, ‘ModelNivelEd’, array(‘CVENIVEL’=>‘CVENIVEL’),‘through’=>‘fk_inmueble’),

pero no se puede por que me marca error por que en el ‘through’ la relacion ‘fk_actba’ me marca que se repite o que ya existe, este es mi problema e buscado pero no encuentro con la solucion si alguien me puede ayudar o pasarme un link de un tema se lo agradeceria mucho. Gracias ;D

Buenas tardes.

ModelPcEscuelasDetalle a q tabla hace referencia?

Es q no entiendo muy bien tu diagrama. Por ejemplo, yo tendría una tabla para municipios y otra para localidades, relacionándolas.

Con lo q tú escribes, sin saber lo q significa cada cosa, entiendo que las relaciones serían las siguientes:

Modelo cap_ref(entendiendo q CLAVECCT se extiende de a_ctba a cap_ref)


'FK_nombre_relacion' => array(self::BELONGS_TO, 'modelA_Ctba', 'CLAVECCT')



Modelo nivel_ed(entendiendo que CVENIVEL se extiende de nivel_ed a cct_inmueb)


'FK_nombre_relacion' => array(self::HAS_ONE, 'modelCct_Inmueb', 'CVENIVEL')

Modelo cct_inmueb(entendiendo que CVENIVEL se extiende de nivel_ed a cct_inmueb y CLAVECCT de a_ctba a cct_inmueb)


'FK_nombre_relacion' => array(self::BELONGS_TO, 'modelNivel_Ed', 'CVENIVEL')


'FK_nombre_relacion' => array(self::BELONGS_TO, 'modelA_Ctba', 'CLAVECCT')

Modelo a_ctba(entendiendo que CLAVECCT se extiende de a_ctba a cap_ref y cct_inmueb




'FK_nombre_relacion' => array(self::HAS_ONE, 'modelCap_Ref', 'CLAVECCT')


'FK_nombre_relacion' => array(self::HAS_ONE, 'modelCct_Inmueb', 'CLAVECCT')

Teniendo en cuanta que no sean HAS_MANY, por ejemplo.

Las de municipios y localidad no tengo ni idea de cómo lo has planteado.

Un saludo.

Gracias por responderme, y ModelPcEscuelasDetalle=cap_ref, las tablas de municipios=municipios y localidades=a_itba, esa relación lo hice de manera visual en navicat, estas en lo correcto con las relaciones que dices, lo que yo estoy intentando de hacer es poner todas esas relaciones en un solo modelo en el de ModelPcEscuelasDetalle por medio del ‘through’=>‘FK_nombre_relacion’ pero no puedo hacer las relaciónes por así decirlo de “3 niveles” solo puedo de “2 niveles”.

Para qué? Es q no entiendo lo que quieres conseguir poniendo todas las relaciones en un sólo modelo, ya q si tienes los modelos bien relacionados, desde un modelo puedes acceder a los datos de todos los demás.

Es decir, teniendo bien relacionados los modelos, tienes relaciones en "infinitos" niveles.

Un saludo.

Primero que nada gracias.

ok ok es que en el gridview necesito llamar a varios campos de otras tablas que no estan relacionadas directamente con el modelo principal si no que el valor pertenece de la relacion de una relacion.

PD. Por desgracia no puedo mover las tablas ni los campos ni nada, en mysql no estan creadas las relacionadas asi se vienen usando desde hace tiempo y no me dejan que las modifique. Estoy empezando a usar yii y se me complica las relaciones.

Adjunto el archivo y pienso hacer las relaciones de la siguiente manera, no se si este mal pero te agradeceria tu sugerencia.

Buenos días.

Creo q no has entendido nada de lo q te comenté ;D , pero te lo explico de nuevo con un ejemplo.

Antes de nada decirte cómo haría yo las relaciones:

IMPORTANTE:Entiendo q los campos ENTIDAD de las tablas a_itba y municipios son identificadores únicos de los registros de cada tabla. Voy a cambiar sus nombres. Hay campos q no sé lo q significan, entonces no te los pondré en mi sugerencia.

TABLA MUNICIPIOS

IdMunicipio [PK]

Municipio (nombre del municipio)

NombreNum

Abrev

TABLA LOCALIDADES

IdLocalidad [PK]

IdMunicipio [FK]

Localidad (nombre de la localidad)

TABLA A_ITBA

IdColonia [PK]

IdLocalidad [FK]

Colonia (nombre de la colonia)

TABLA A_CTBA

ClaveCCT [PK]

IdColonia [FK]

…resto de campos…

Con estas relaciones, te voy a explicar el ejemplo de cómo acceder a cualquier relación entre las tablas.

EJEMPLO

Tú vas a taner un escenario con una serie de tablas, y vamos a trabajar por ejemplo sobre la tabla A_CBTA.

En tú aplicación Yii tendrás creados modelos para todas las tablas con las q vayas a trabajar, pq sino no podrás trabajar con sus datos. Y cada modelo tendrá las relaciones q correspondan. Nosotros vamos a trabajar con las relaciones de las tablas A_CBTA, A_ITBA, LOCALIDADES y MUNICIPIOS.

Relaciones modelo Municipios


'FK_Municipios_Localidades' => array(self::HAS_MANY, 'Localidades', 'IdMunicipio'),

Relaciones modelo Localidades




'FK_Localidades_Municipios' => array(self::BELONGS_TO, 'Municipios', 'IdMunicipio'),

'FK_Localidades_Colonias' => array(self::HAS_MANY, 'A_ITBA', 'IdLocalidad'),

Relaciones modelo A_ITBA


'FK_Colonias_Localidades' => array(self::BELONGS_TO, 'Localidades', 'IdLocalidad'),

'FK_Colonias_ACTBA' => array(self::HAS_MANY, 'A_CTBA', 'IdColonia'),

Relaciones modelo A_CTBA




'FK_ACTBA_AITBA' => array(self::BELONGS_TO, 'A_ITBA', 'IdColonia'),

...y las q correspondan (yo sólo pongo esta pq es la q me interesa...

Una vez q tengamos esto, declarando un modelo de A_CBTA, ya tendremos todos los datos referidos al mismo, independientemente d q A_CBTA no esté relacionado directamente con Municipios. Esto no hace falta, para eso sirve un modelo relacional de datos.

Vamos a decir q en un gridview tú quieres mostrar el campo ClaceCct del modelo A_CBTA y el campo Municipio del modelo Muncipios. Pues sería tan simple como acer esto:




$this->widget('application.components.GridView', array(

                            'id'=>'to-a_cbta-grid',

                            'dataProvider'=>A_CBTA::model()->search(),

                            'filter'=>$A_CBTA::model(),

                            'columns'=>array(

                                            'ClaveCct,

                                            array('header'=>'Municipio', 

                                                    'value'=>'$data->FK_ACTBA_AITBA->FK_Colonias_Localidades->FK_Localidades_Municipios->Municipio' ),


                                        ),

    )); 

Fíjate q lo único q he hecho ha sido referenciar al campo Municipio de la tabla Municipios mediante las relaciones de cada modelo.

Si revisas todos tus modelos, justo al inicio del archivo php hay una serie de datos de "cabecera" en gris (yo uso Netbeans, en otros entornos serán de otro color) q indican q variables se crean en el momento de crear un objeto del modelo en cuestión. Y ahí aparecen "variables" o objetos para las relaciones.

Espero q te haya quedado más claro.

Un saludo.

PD.: si no hay relaciones en tus modelos las puedes crear tú a mano.

Excelente explicacion… Justo lo que andaba buscando funciono perfecto!! :D