Listar registros relacionados

Bom dia pessoal, estou com dificuldades para listar registros relacionados, por exemplo, no cadastro de um projeto tem o usuario que cadastrou (tabela user), na listagem dos projetos está listando o código do usuário, gostaria de listar o nome do usuário e no filtro da coluna usuário, gostaria de deixar um textfield onde ele pesquisa o nome ou parte do nome do usuário, mesma coisa na busca avançada, estou tentando algumas maneiras, porém sem sucesso.


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

	'id'=>'project-category-grid',

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

	'filter' => $model,

	'columns' => array(

		array(

			'value'=>'CHtml::checkBox("id",null,array("value"=>$data->id,"id"=>"id".$data->id))',

			'type'=>'raw',

			'htmlOptions'=>array('width'=>5),

		),

		array(

			'name'=>'id',

			'htmlOptions'=>array('width'=>20),

		),

		array(

			'name'=> 'user.username',

		    'value' => User::model()->findByPk($model->user_id)->username

		),...

Assim até aparece o nome do usuário na listagem, mas o campo filtro some.


array(

			'name'=> 'user_id',

		    'value' => User::model()->findByPk($model->user_id)->username

		),

Assim o filtro aparece, mas na listagem exibe os id’s dos usuário, além disso o filtro considera o id e não o nome do usuário, outra coisa, ao filtrar pelo user_id = 2 ele passa a exibir o nome dos usuários na lista.

Alguém tem alguma idéia?

Obrigado!

Ninguém por aqui fez uma listagem simples com 2 tabelas relacionadas?

Resolvido!

Model:


public function getUserFilter() {

	

        $Criteria = new CDbCriteria();

        $Criteria->select = "username";

        $results = User::model()->findAll($Criteria);

        $user_list = array();

        foreach ($results as $result) {

        	$user_list[$result->username] = $result->username;

        }

        

    	return $user_list;

	}


public function search()

	{

		...

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

		

		...

		$criteria->compare('user.username', $this->user_id);

...

View (Listagem):


...

array(

        	'name' => 'user_id',

            'header' => 'User',

            'type' => 'raw',

            'value' => '$data->user->username',

            'filter' => $model->getUserFilter(),

			'htmlOptions'=>array('width'=>'10'),

		),

		array(

...

Desculpem reviver o tópico, eu estava com o mesmo problema e a solução do amigo acima funcionou perfeitamente, porém ele mostra um erro quando mudo o filtro, falando que as ids estão duplicadas.

Este é o erro:


Integrity constraint violation: 1052 Column 'cat_id' in where clause is ambiguous

Eu estou aprendendo Yii então o que estou fazendo é somente teste, eu criei uma tabela produtos, e uma tabela produto_cat…

Na tabela produto eu tenho o cat_id que eu relaciono com o cat_id da tabela produto_cat, provavelmente o erro é pq coloquei o nome cat_id nas duas tabelas, isso realmente não pode acontecer?

Lucas,

Normalmente o Yii adiciona alias aos nome das tabelas, para que não tenha conflitos com atributos repetidos.

Mais você pode definir sua alias para cada tabela, pode abrir qualquer Model, e adicionar a seguinte função:




public function defaultScope()

{

     return array(

          'alias' => 'prod',

     );

}



Veja pode você está buscando os dados, e adiciona prod.cat_id.