CGridView não apresenta coluna

Olá Pessoal,

Tenho duas tabelas uma chamada mail_incoming que a tabela pai(PK duplo inc_id e inc_queue_id) e a outra chamada mail_outgoing filha(PK duplo out_id e out_queue_id)

Elas não possui relacionamento devido a alguns registros repetirem em algum momento. Porem o que liga elas efetivamente são os campos inc_queue_id e out_queue_id

Bom, o meu problema é simples mas já estou a 2 dias quebrando a cabeça para simplismente o campo out_to da tabela mail_outgoing no CGridView

Bom eu segui o tuturial http://www.yiiframework.com/wiki/280/1-n-relations-sometimes-require-cdbcriteria-together/

Segue o meu model MailIncoming:





public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('inc_queue_id', 'required'),

			array('inc_size, inc_nrcpt', 'numerical', 'integerOnly'=>true),

			array('inc_queue_id', 'length', 'max'=>12),

			array('inc_client_connect', 'length', 'max'=>15),

			array('inc_client_helo, inc_message_id, inc_from, inc_subject', 'length', 'max'=>255),

			array('inc_date, inc_time', 'safe'),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('out_to,inc_id, inc_date, inc_time, inc_queue_id, inc_client_connect, 

inc_client_helo, inc_message_id, inc_from, inc_subject, inc_size, inc_nrcpt', 'safe', 'on'=>'search'),

		);

	}




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(

                    'delivered'=>array(self::HAS_MANY,'MailOutgoing',

                                        'out_queue_id',

                                        'joinType'=>'INNER JOIN',

                                ),

		);

	}




        public $out_to;

        

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.

                

		$criteria=new CDbCriteria;

                

                $criteria->with = array('delivered');;

                $criteria->together = true;


		$criteria->compare('inc_id',$this->inc_id);

		$criteria->compare('inc_date',$this->inc_date,true);

		$criteria->compare('inc_time',$this->inc_time,true);

		$criteria->compare('inc_queue_id',$this->inc_queue_id,true);

		$criteria->compare('inc_client_connect',$this->inc_client_connect,true);

		$criteria->compare('inc_client_helo',$this->inc_client_helo,true);

		$criteria->compare('inc_message_id',$this->inc_message_id,true);

		$criteria->compare('inc_from',$this->inc_from,true);

		$criteria->compare('inc_subject',$this->inc_subject,true);

		$criteria->compare('inc_size',$this->inc_size);

		$criteria->compare('inc_nrcpt',$this->inc_nrcpt);

                $criteria->compare('delivered.out_to',$this->out_to);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

                

                

	}



Observem que o "$this->out_to" esta declarado e o "delivered" e o alias do relacionamento. Também temos as rules onde eu declarei a variavel "out_to"

Segue a View:




<?php 

        

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

	'id'=>'mail-incoming-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'inc_id',

		'inc_date',

		'inc_time',

		'inc_queue_id',

		'inc_client_connect',

		'inc_client_helo',

                array(

                    'name'=>'out_to',

                    'value'=>'$data->delivered->out_to',

                    'type'=>'text',

                ),

            

		/*

		'inc_message_id',

		'inc_from',

		'inc_subject',

		'inc_size',

		'inc_nrcpt',

		*/

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>



Observem o trecho:




array(

                    'name'=>'out_to',

                    'value'=>'$data->delivered->out_to',

                    'type'=>'text',

                ),



Esse linka com os campos da tabela corretamente.

E por ultimo segue a SQL que o Yii monta:




SELECT "t"."inc_id" AS "t0_c0", "t"."inc_date" AS "t0_c1", "t"."inc_time" AS "t0_c2", "t"."inc_queue_id" AS "t0_c3",

 "t"."inc_client_connect" AS "t0_c4", "t"."inc_client_helo" AS "t0_c5", "t"."inc_message_id" AS "t0_c6", "t"."inc_from" 

AS "t0_c7", "t"."inc_subject" AS "t0_c8", "t"."inc_size" AS "t0_c9", "t"."inc_nrcpt" AS "t0_c10", "delivered"."out_id" 

AS "t1_c0", "delivered"."out_date" AS "t1_c1", "delivered"."out_time" AS "t1_c2", "delivered"."out_queue_id" 

AS "t1_c3", "delivered"."out_to" AS "t1_c4", "delivered"."out_to_orig" AS "t1_c5", "delivered"."out_relay" 

AS "t1_c6", "delivered"."out_delay" AS "t1_c7", "delivered"."out_delays" AS "t1_c8", "delivered"."out_dsn" 

AS "t1_c9", "delivered"."out_status" AS "t1_c10", "delivered"."out_status_message" AS "t1_c11", 

"delivered"."out_queue_id_remote" AS "t1_c12" FROM "mail_incoming" "t"  

INNER JOIN "mail_outgoing" "delivered" ON ("delivered"."out_queue_id"="t"."inc_queue_id")  

LIMIT 10



O que acontece é que infelizmente a Grid não apresenta o campo out_to do relacionamento segue o print da tela que esta em anexo

2764

tela.png

Pessoal qualquer ajuda será bem vinda.

Abraços e desde já agradeço

Rodrigo

Rodrigo,

Como é o relacionamento entre as tabelas? 1 para 1, 1 para muitos, muitos para muitos ou muitos para 1?

Enta mudar para:


'value'=>'$data->delivered[0]->out_to'

Por que vi que você coloco HAS_MANY na relação.

Olá Newerton,

É um para muitos(1->N).

Vou testar e posto o resultado. Como contorno eu fiz assim e deu certo:




public function buscar()

        {

                $criteria=new CDbCriteria;

                

                $criteria->compare('inc_date',$this->inc_date,true);

		$criteria->compare('inc_time',$this->inc_time,true);

                $criteria->compare('inc_from',$this->inc_from,true);

                $criteria->compare('inc_queue_id',$this->inc_queue_id,true);

                $criteria->compare('inc_client_helo',$this->inc_client_helo,true);

		$criteria->compare('inc_message_id',$this->inc_message_id,true);

		$criteria->compare('inc_subject',$this->inc_subject,true);

                $criteria->compare('out_to',$this->out_to,true);

                

                $criteria->select='inc_id,inc_date,inc_time,inc_from,inc_message_id,

                                   inc_client_helo,inc_subject,out_to,out_to_orig';

                $criteria->join='INNER JOIN mail_outgoing on out_queue_id=inc_queue_id';

                $criteria->order='inc_id DESC';

                $criteria->limit='10';

                            

            	return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

        }



Ou seja, motei toda SQL no CDBCriteria e declarei as variaveis como public $out_to e $out_to_orig.

Ai sim apareceu na CGridView.

Minha preocupação é se esse, é o melhor método e se não estou reinventando a roda uma vez que o GII já faz esse meio de campo.

Desde já agradeço as informações

Abraços

Rodrigo,

A query que você postou no primeiro post está correto?

(Resumi colocando o *)




SELECT * FROM "mail_incoming" "t"  

INNER JOIN "mail_outgoing" "delivered" ON ("delivered"."out_queue_id"="t"."inc_queue_id")  

LIMIT 10



Por que se estiver correto, ele ta buscando os dados, só não está mostrando, ai podemos debugar onde está o erro.