Relaciones Subiendo Dos Niveles

Tengo la tabla CXCCLIENTE relacionada con CXCVENDEDOR que esta relacionada con CONTANIT.Quiero que al crear un cliente el combo que pide la ID del vendedor en la tabla cliente traiga el nombre del vendedor, que es el campo NOMBRE en CONTANIT.Pienso que el problema esta en cómo instanciar la representing column de la tabla CONTANIT subiendo dos niveles para encontrar el nombre del vendedor.

Yo puedo hacerlo en la creacion de CXCVENDEDOR, pero no en CXCCLIENTE.

Este es el codigo al crear el vendedor:

<?php if($model->isNewRecord)

echo &#036;form-&gt;dropDownListRow(&#036;model, 'contanit_id',    CHtml::listData(Contanit::model()-&gt;findAll(), 'id',Contanit::representingColumn()));						  }

else

{echo CHtml::encode('Nit ');	


 echo CHtml::encode(&#036;model-&gt;contanit-&gt;nombre);?&gt;&lt;br /&gt;

El else corresponde a la vista UPDATE porque el NIT no es editable.

Gracias por sus respuestas de antemano.

EdSolano

[color="#006400"]/* Moved from "General Discussion for Yii 1.1.x" to "Spanish" */

/* Please use English in general forums */[/color]

Buenas tardes.

En primer lugar, tú vas a tener las 3 tablas relacionadas no?

Imaginemos estos modelos:

Modelo A:




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(

                    'FK_A_B' => array(self::BELONGS_TO, 'B', 'IdB'),

        );

    }

Modelo B:




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(

                    'FK_B_C' => array(self::BELONGS_TO, 'C', 'IdC'),

        );

    }

Además tendremos un modelo C que será el "padre" de B y el "abuelo" de A. Y nosotros queremos acceder a un dato de C (llamémosle "Datito") desde una vista de A (es eso lo que quieres,no?)

Pues es tan sencillo como hacer lo siguiente:




$valorDatito = $modelA->FK_A_B->FK_B_C->Datito;



Siguiendo las relaciones de los modelos podemos acceder a todos los datos de los mismos siemrpe que estén relacionados.

Fíjate que al inicio de todos tus modelos deberías de tener algo como esto:




/**

 * This is the model class for table "A".

 *

 * The followings are the available columns in table 'A':

 * @property integer $IdA

 * @property integer $IdB

 *

 * The followings are the available model relations:

 * @property B $FK_A_B

 */



Esta última propiedad $FK_A_B es la que nos permite en este caso acceder a los datos de B, y como B tendrá algo parecido respecto de C…blanco y en botella.

Un saludo.

Muchas gracias por tu respuesta, la cual me es muy útil para trabajar con herencias.

He encontrado una solución directa al asunto de la columna a mostrar, utilizando el concepto "representing column".

Uno puede definir cualquier columna representativa en el modelo, de la siguiente forma:

En el modelo de cxcvendedor:

   public static function representingColumn() {


       return 'id' ;


    


    }


   public static function columnaRelacionada() {


       return 'contanit.nombre' ;


    


    }


   public static function columnaRelacionadaDocumento() {


       return 'contanit.documento' ;


    


    }

Contanit es padre de vendedor y abuelo de cliente.

Luego, en el _form de cxcvendedor, sustituimos representingColumn por columnaRelacionada:

<?php echo $form->dropDownListRow($model, ‘cxcvendedor_id’, CHtml::listData(Cxcvendedor::model()->findAll(), ‘id’, Cxcvendedor::columnaRelacionada())) ?>

En este caso es muy fácil subir un nivel, y ademas, podemos optar por cualquier columna en cualquier vista para presentar los combos.

Muchas gracias de nuevo, porque tu respuesta me aclara mucho sobre el uso de objetos en este ambiente.

Att

Ed Solano

Y no te sería aún más fácil crear una propeidad en el modelo nieto para representar un dato de su abuelo?

[u][b]

modelo nieto[/b][/u]




public function getNombreAbuelo()

    {

        return $this->FK_Relacion_Padre->FK_Relacion_Abuelo->NombreAbuelo;

    }



Y cuando cargues tu combo:




echo $form->dropDownListRow($model, 'nieto_id', CHtml::listData(nieto::model()->findAll(), 'nieto_id', 'NombreAbuelo'));

Un saludo.

Ciertamente

Es otra solución muy fácil

Gracias por tu interés.

EdSolano