Filtro Recursivo en CgridView

Saludos amantes del Yii.

Hoy vengo con un problema que no me deja dormir tranquilo y es lo siguiente. En mi proyecto controlo un sistema para la gestion de perros. Ahora en este sistema necesito filtrar en la vista admin los criadores y los padres de los perros. Donde por supuesto Criadores son un modelo aparte pero los padres pertenecen al mismo modelo de perros. Aqui muestro lo que tengo:

en el Modelo Perro:

Relaciones




public function relations()

	{

		return array(

			'criador' => array(self::BELONGS_TO, 'Asociados', 'criador_id'),

			'perroPadre' => array(self::BELONGS_TO, 'Perro', 'perroPadre_id' ),

		);

	}



Aqui mi funcion Search




public function search()

	{

$criteria=new CDbCriteria;

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

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

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

//etc otros compare del modelo


$criteria->with=array('criador','perroPadre'); //aqui uno las dos relaciones que necesito para filtrar en mi vista admin

$criteria->addSearchCondition('LOWER(criador.ci)', strtolower($this->criador_id)); //aqui instancio el criador

$criteria->addSearchCondition('LOWER(perroPadre.cod)', strtolower($this->perroPadre_id), true); //aqui instancio el padre



en mi vista admin




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

	'id'=>'perro-grid',

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

	'filter'=>$model,

	'columns'=>array(

        'id',

        'cod',

         array(

                'name'=>'sexo_per',

                'value'=> 'Perro::getSexoOption($data->sexo_per)', 

                'filter'=>array(1=>'Macho', 2=>'Hembra'),

                ),

         array(

                'name'=>'color',

                'value'=> 'Perro::getColorOption($data->color)', 

                'filter'=>CHtml::listData(Perro::getColorOptions(),'id', 'title'),

                ),

         array('name'=>'criador_id',

		'value'=>'$data->criador->ci',


			),

         array(

		 'name' => 'perroPadre_id',//esta es la importante que es el elemento relacionado

	        'value' => '$data->perroPadre->cod',

	       ),



Hasta ahi todo perfecto corre bien incluso filtra bien por criador y perroPadre el problema donde esta que cuando voy a filtrar por alguna otra columna. me muestra el siguente error.




Error 500: CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'sexo_per' in where clause is ambiguous



Lo mismo con color o cualquier otra columna. por supuesto que entiendo que perroPadre es un objeto del mismo tipo que perro es decir tienen el mismo modelo y los mismos atributos, asi que cuando haga el search no va a saber la consulta con cual de los perros es y por eso me dice que es ambigua la consulta. he leido algo sobre poner alias pero igual lo que he intentado poner no me sirve y sigue sin funcionarme. Asi que por favor si alguien tiene un post que hable de este tema o puede darme una mano para arreglar este error, se lo agradesco de antemano.

Buenas.

Lo que te dice el error es que la consulta no se ejecuta correctamente pq el campo ‘sexo_per’ es ambiguo.

Esto quiere decir que tienes 2 o más tablas que tienen campos con ese nombre en la consulta SQL.

En lo poco que publicas de tu código no veo dónde puede estar el error pq no te refieres nunca a ese campo, pero supongo que no has publicado todo el códigoo.

Normalmente ese tipo de error se dá en el criteria, por ejemplo en el compare.

Por defecto, Yii asigna el alias "t" a la tabla del modelo en donde está la función de búsqueda. Por ejemplo, si tienes un modelo llamado "modelito" y una función llamada "searchModelito" que devuelve un dataprovider, la consutla SQL que se genera será algo como:

SELECT t.nombreCampo FROM MODELITO t …

En algún sitio de tu función search estás utilizando la columna ‘sexo_per’, entonces lo que tienes que hacer es colocarle delante el alias que corresponda y listo.

Si se refiere a la tabla del propio modelo, sería t.sexo_per.

Si se refiere a una tabla de relación sería nombreRelacion.sexo_per, donde "nombreRelacion" es el nombre que tú le das en tu función "relations" de tu modelo.

No se si me he explicado bien o te he liado más.

Espero que te sirva.

Un saludo.