Ae pessoal depois de apanhar muito, existem outras duas soluções,
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->searchListar(),
'columns'=>array(
'Conta.Contrato.operadora', // primeira solução
array( // segunda solução
'name'=>'operadora',
'value'=>'$data->Conta->Contrato->operadora',
),
),
));
só que para isso funcionar é preciso ter configurado as Relations dentro de cada models
exemplo:
Model Conta:
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(
'Contrato'=>array(self::BELONGS_TO, 'Contrato', 'id_contrato'),
'Registro'=>array(self::HAS_MANY, 'Registro', 'id_conta'),
);
}
Model Contrato:
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(
'Empresa' => array(self::BELONGS_TO, 'Empresa', 'id_empresa'),
'Conta'=>array(self::HAS_MANY, 'Conta', 'id_conta'),
);
}
Como o tópico tem a ver com a minha dúvida vou aproveita-ló,
Bom, tenho um CGridView, onde no ‘dataProvider’
'dataProvider'=>$model->searchListar(),
eu fiz uma nova função searchListar()
public function searchListar()
{
$criteria = new CDbCriteria;
$criteria->distinct = TRUE;
$criteria->select = array('Contrato.operadora', 'Empresa.nome', 'R.mesReferencia', 'R.anoReferencia');
$criteria->alias = 'R';
$criteria->join = ' INNER JOIN Conta ON R.id_conta = Conta.id_conta INNER JOIN Contrato ON Conta.id_contrato = Contrato.id_contrato INNER JOIN Empresa ON Contrato.id_empresa = Empresa.id_empresa';
$criteria->condition = 'Contrato.id_empresa = '.Yii::app()->user->getState('id_empresa').' ';
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
));
}
até ai tudo certo, no CGridView está aparecendo somente os registros que eu quero, o problema é que no CGridView está informando "Exibindo 1-1 de 10138 resultado(s)." (10138 é a quantidade de registros na tabela) só que para essa query retorna bem menos que essa quantidade, será que faltou alguma coisa na implementação do meu $criteria?
public function searchListar()
{
$criteria = new CDbCriteria;
$criteria->condition = 'Co.id_empresa = '.Yii::app()->user->getState('id_empresa');//.' AND R.id = 30';
$criteria->alias = 'R';
$criteria->select = array('Co.operadora', 'E.nome', 'R.mesReferencia', 'R.anoReferencia');
$criteria->join = 'INNER JOIN Conta Ca ON R.id_conta = Ca.id_conta INNER JOIN Contrato Co ON Ca.id_contrato = Co.id_contrato INNER JOIN Empresa E ON E.id_empresa = Co.id_empresa';
$criteria->group = 'R.anoReferencia';
$criteria->group = 'R.mesReferencia';
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
));
}
Uma pergunta básica, mais que não estou conseguindo resolver. Tenho uma GridView com um campo Status, no banco de dados para este campo é salvo o valor 0, 1 ou 2. Gostaria de visualizar na grid não esses valores e sim o seguinte: 0 = "DESATUALIDADO", 1 = "ATUALIZADO" e 2 = "EM ANDAMENTO". Como faço isso??