Relacion Entre Tablas Has_Many / Belongs_To

Buenas tardes, despues despues de hacer una pequeña aplicacion, el DBA decide cambiarme las tablas… siento odio <.<

Asi estaba antes:

Asi esta despues:

Antes yo buscaba el Nombre y Apellido (tbl_Persona) de la Maxima Autoridad (tbl_MaximaAutoridad) de una estructura (tbl_estructura) así a travez de las relaciones:

Ej en el View


<h1><?php echo $model->denominacion; ?></h1>

<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		//'id',

		'idpadre',

		'idtipoestructura0.denominacion',

		'idparroquia0.idmunicipio0.idestado0.estado',

		'idparroquia0.idmunicipio0.municipio',

		'idparroquia0.parroquia',

		'idmaximaautoridad0.idpersona0.nombre',

		'idmaximaautoridad0.idpersona0.apellido',

		'codigoonapre',

		'denominacion',

		'ubicacionfisica',

		'paginaweb',

		'telefono',

		//'estatusreg',

	),

)); ?>

Ej. en el Admin


<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'tbl-estructura-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		array('name'=>'idmaximaautoridad0.idpersona0.nombre',

		   'value'=>'$data->idmaximaautoridad0->idpersona0->nombre',

		   'filter'=>CHtml::activeTextField($model,'varIdpersonaTE'),

                array('name'=>'idmaximaautoridad0.idpersona0.apellido',

		   'value'=>'$data->idmaximaautoridad0->idpersona0->apellido',

		   'filter'=>CHtml::activeTextField($model,'varIdpersona2TE')

		   ),

           array(

	   'class'=>'CButtonColumn',

		),

	),

)); ?>

Con el nuevo diseño de la Base de datos ahora como puedo llamarlos? intenté esto pero no me trae nada.




'tblMaximaautoridadEstructuras.idmaximaautoridad0.idpersona0.nombre',

'tblMaximaautoridadEstructuras.idmaximaautoridad0.idpersona0.apellido',



Solo debes agregar la nueva relación

Relación en el modelo TblEstructura


'idmaximaautoridadestructura0'=>array(self::HAS_ONE,'TblMaximaAutoridadEstructura','idestructura'),

Relación en el modelo TblMaximaAutoridadEstructura


'idmaximaautoridad0'=>array(self::BELONGS_TO,'TblMaximaAutoridad','idmaximaautoridad'),

Relación en el modelo TblMaximaAutoridad


'idpersona0'=>array(self::BELONGS_TO,'TblPersona','idpersona'),

Y los llamas asi


<?php $this->widget('zii.widgets.grid.CGridView', array(

        'id'=>'tbl-estructura-grid',

        'dataProvider'=>$model->search(),

        'filter'=>$model,

        'columns'=>array(

                array('name'=>'idmaximaautoridadestructura0.idmaximaautoridad0.idpersona0.nombre',

                   'value'=>'$data->'idmaximaautoridadestructura0->idmaximaautoridad0->idpersona0->nombre',

                   'filter'=>CHtml::activeTextField($model,'varIdpersonaTE'),

                array('name'=>'idmaximaautoridadestructura0.idmaximaautoridad0.idpersona0.apellido',

                   'value'=>'$data->'idmaximaautoridadestructura0->idmaximaautoridad0->idpersona0->nombre',

                   'filter'=>CHtml::activeTextField($model,'varIdpersona2TE')

                   ),

           array(

           'class'=>'CButtonColumn',

                ),

        ),

)); ?>



Hola de nuevo. te cuento, los modelos ya trae una relacion entre las tablas

(tbl_estructura <-- > tbl_maximaautoridad_estructura)

(tbl_maximaautoridad_estructura <–> tbl_maximaautoridad)

(tbl_maximaautoridad <–> tbl_persona)

Relacion en TblEstructura.php


'tblMaximaautoridadEstructuras' => array(self::HAS_MANY, 'TblMaximaautoridadEstructura', 'idestructura'),

de igual manera copie la que me diste para probar si era el tipo HAS_ONE.

Relacion en TblMaximaautoridadEstructura.php


'idmaximaautoridad0' => array(self::BELONGS_TO, 'TblMaximaautoridad', 'idmaximaautoridad'),

Relacion en TblMaximaAutoridad


'idpersona0' => array(self::BELONGS_TO, 'TblPersona', 'idpersona'),

Cuando hago el llamado en la vista (admin.php) de tblEstructura la pagina simplemente no trae nada. queda totalmente en blanco. aqui el codigo


<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'tbl-estructura-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		'denominacion',

		array('name'=>'idtipoestructura0.denominacion',

		   'value'=>'$data->idtipoestructura0->denominacion',

		   'filter'=>CHtml::activeTextField($model,'varDenominacionTE')

		   ),

		array('name'=>'idparroquia0.idmunicipio0.idestado0.estado', 

		   'value'=>'$data->idparroquia0->idmunicipio0->idestado0->estado',

		   'filter'=>CHtml::activeTextField($model,'varIdestadoTE')

		   ),


		array('name'=>'tblMaximaautoridadEstructuras.idmaximaautoridad0.idpersona0.nombre',

              'value'=>$data->'tblMaximaautoridadEstructuras->idmaximaautoridad0->idpersona0->nombre',

              'filter'=>CHtml::activeTextField($model,'varIdpersonaTE'),

       		),

		'codigoonapre',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>

PD: tambien lo intenté con la relacion que tu me diste y pasa lo mismo. creo que tiene que ver con el tipo de relacion que tienen, porque cuando son BELONGS_TO no hay problema en llamarlo a travez de las relaciones, pero cuando es otro supongo que hay que llamarlo de otra manera. he estado buscando bastante pero no encuentro nada al respecto o no estoy buscando de la manera correcta (que es lo mas probable).

Si tan solo pudiera pasar un dato de la tabla tbl_maximaautoridadEstructura ya las demas relaciones (BELONGS_TO) son llamadas como normalmente se hacen, pero no pueod ni eso. a traves de la relacion no puedo traerme nisiquiera el statusreg de la tabla :S supongo por la orientacion de la relacion. -->

:blink:

Hay que definir una cosa primero.

¿La relación entre tbl_estructura y tbl_maximaautoridad_estructura es uno a muchos o uno a uno?

Si es uno a muchos entonces la relación debe ser HAS_MANY


'tblMaximaautoridadEstructuras' => array(self::HAS_MANY, 'TblMaximaautoridadEstructura', 'idestructura'),

pero esto hace que $data->tblMaximaautoridadEstructuras sea un array y para mostrar un valor en el CGridView tienes que seleccionar un elemento del array por ejemplo para mostrar el primer elemento del array en el CGridView


$data->'tblMaximaautoridadEstructuras[0]->idmaximaautoridad0->idpersona0->nombre'

Pero si es uno a uno la relación debe ser HAS_ONE


'tblMaximaautoridadEstructuras' => array(self::HAS_ONE, 'TblMaximaautoridadEstructura', 'idestructura'),

y esto hace que $data->tblMaximaautoridadEstructuras sea un modelo y para mostrarlo en el CGridView


$data->'tblMaximaautoridadEstructuras->idmaximaautoridad0->idpersona0->nombre'

Ahora la pagina se te muestra en blanco no por las relaciones, si no porque estas poniendo mal el atributo value del nombre de la persona, cambia esto


'value'=>$data->'tblMaximaautoridadEstructuras->idmaximaautoridad0->idpersona0->nombre',

por esto


'value'=>'$data->tblMaximaautoridadEstructuras->idmaximaautoridad0->idpersona0->nombre',

fijate de la comilla que tienes puesto, es lo que esta mal.

Una vez mas te doy mil gracias por la ayuda. te dejo los puntos correspondientes por la ayuda. era HAS_MANY como dijiste y claro el error de value tambien lo tenia. muchisimas gracias de nuevo. :)

PD: Si por casualidad sabes como poner un array(‘style’ => ‘text-transform: uppercase’) a las cajas de texto de busqueda en el admin. me vendria bien :)

gracias! ;D

Para poner estilo a los filtros es como dices


'filter'=>CHtml::activeTextField($model,'varIdpersonaTE',array("style"=>"text-transform:uppercase")),

Gracias, lo habia intentado asi pero la cuestion era que transformaba el texto mostrado a mayusculas, pero la busqueda la hacia en minuscualas. solo necesitaba agregar el strtoupper al search().


'filter'=>CHtml::activeTextField($model,'varIdpersonaTE',array("style"=>"text-transform:uppercase")),




$criteria->compare('idtipoestructura0.denominacion',strtoupper($this->varDenominacionTE),true);

$criteria->compare('idestado0.estado',strtoupper($this->varIdestadoTE),true);

$criteria->compare('idpersona0.nombre',strtoupper($this->varIdpersonaTE),true);

$criteria->compare('idpersona0.apellido',strtoupper($this->varIdpersona2TE),true);

Disculpa, una "ultima" pregunta jejeje si quisiera llamarlo desde un CDetailView por ejemplo en el view.php como podria llamarlo? lo intenté pero no me deja. así


<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		//'id',

		'idpadre',

		'idtipoestructura0.denominacion',

		array('name'=>'Ubicacion',

		   'value'=>' ---------------------',

		   'filter'=>''),

		'idparroquia0.idmunicipio0.idestado0.estado',

		'idparroquia0.idmunicipio0.municipio',

		'idparroquia0.parroquia',

		array('name'=>'Maxima Autoridad',

		   'value'=>' ---------------------',

		   'filter'=>''),

		'estatusreg',

		array('label'=>'Nombre',

			  'type'=>'raw',

			  'name'=>'tblMaximaautoridadEstructuras[0].idmaximaautoridad0.idpersona0.nombre'),

		//'tblMaximaautoridadEstructuras[0].idmaximaautoridad0.idpersona0.apellido',

		//'tblMaximaautoridadEstructura[0].idmaximaautoridad0.idpersona0.nombre',

		'codigoonapre',

		'denominacion',

		'ubicacionfisica',

		'paginaweb',

		'telefono',

		//'estatusreg',

	),

)); ?>

Solo le agregas el atributo value


array('label'=>'Nombre',

      'type'=>'raw',

      'name'=>'tblMaximaautoridadEstructuras[0].idmaximaautoridad0.idpersona0.nombre',

      'value'=>$model->tblMaximaautoridadEstructuras[0]->idmaximaautoridad0->idpersona0->nombre),

Lo intenté de todas las maneras menos esa jajaja. muchisimas gracias! +1 :D

hola, amigo una pregunta. cuando creo una estructura nueva me da error, justo en esta parte el "tblMaximaautoridadEstructuras[0]" claro esta no existe porque no hay una relacion creada entre la "tbl_Maximaautoridad_Estructura" y la "tbl_estructura" lo que quiero es hacer una funcion que me traiga "Aun sin Asignar" si esta relacion no existe ó si la relacion esta creada, que traiga el "tblMaximaautoridadEstructuras[0]->idmaximaautoridad0->idpersona0->nombre" espero hacerme entender. lo que tengo va así:




array('label'=>'Nombre',

	'type'=>'raw',

	'value'=>$model->NombreMa),



y mi funcion en el model va así:




public function getNombreMa()

	{

		//if ($model->tblMaximaautoridadEstructuras[0].id === null ) {




		if (isset($this->tblMaximaautoridadEstructuras[0]) ) {

			$varStatus = $this->tblMaximaautoridadEstructuras[0]->idmaximaautoridad0->idpersona0->nombre;

			echo $varStatus;

			


		}else{


			$varStatus = 'Aun sin Asignar';

			echo $varStatus;

			//$varstatus = $this->rutaNombre

			

		}

		return $this->varStatus;

	}



La cuestion esta en que no me trae nada en el value pero cuando hago el echo si me tra el nombre o el Aun sin Asignar, debe ser la manera de como estoy llamando la funcion y como devuelve el valor.

espero que me puedas o puedan ayudar, cualquier idea esta bien. estoy consciente que es un problema de nomenclatura, la logica es sencilla.

Lo que tienes que entender es que no es lo mismo $varStatus que $this->varEstatus, en tu código la primera es una variable que solo existe en la función getNombreMa, mientras que la segunda es una variable/attributo que existe en toda la clase.

justo antes del return de la función debes poner

$this->varStatus=$varEstatus;

Muchisimas gracias a18327 :) me has ayuado muchisimo excelente explicación. :)