Misma tabla varios GridView

Hola Amigos del foro, soy nuevo en yii y estoy implementando un sistema que en su base de datos existen tablas que son generalizadas por otra.

Una tabla llamada ‘Personas’ y esta a su vez generaliza a una tabla llamada ‘Clientes’ y a otra llamada ‘Proveedores’. Ya trabajé la parte de inserción, eliminación y actualización utilizando controladores para múltiples modelos, y me funciona perfecto.

El detalle es que cuando estoy utilizando el ‘GridView’ que me muestra los ‘Clientes’, a partir de la relación entre ‘Personas’ y ‘Clientes’, me muestra los otros registros de ‘Personas’ relacionados con la tabla ‘Proveedores’.

He intentado modificar la acción que renderiza la vista que contiene el grid agregando una condición para que me muestre solamente los valores que están en ‘Personas’ y en ‘Clientes’, pero me salta error.

public function actionIndex()


{


	$model=new Personas('search');


	$model->unsetAttributes();  // clear any default values


	if(isset($_GET['Personas']))


		$model->attributes=$_GET['Personas'];





	$this->render('index',array(


		'model'=>$model,


	));


}

Me serviría mucho su ayuda.

Saludos.

Tienes dos modelos Personas y Clientes, ahora debes tener las relaciones entre esas tablas.

En el modelo Personas debes tener una relación con la tabla clientes, puedes llamarle cliente


'cliente'=>array(self::HAS_ONE,'Clientes','id_persona'),

En el modelo Clientes debes tener una relación con la tabla personas, puede llamarle persona


'persona'=>array(self::BELONGS_TO,'Personas','id_persona'),

Despues en metodo search del modelo agregas


...

$criteria->with=array('cliente');//La relacion

$criteria->compare ( 'cliente.id_persona IS NOT NULL', 1, false);//Esta linea hace que solo se muestren las personas que sean clientes, si es cliente necesariamente su id_persona no debe ser nulo.

...

Muchas gracias por responder. Voy a intentar hacerlo de esa manera.

Hola césar, espero estes bien, la contestación que te da el compañero a18327 es muy buena, aunque a lo mejor ya tienes realiza la relación, si en tu base de datos de esas tres tablas, ya tienes indicada tu relación osea foreign key, el crud de yii ya te genera eso que ocupas en tu modelo de esta forma:




array(

  'name'=>'tu campo de base de datos',

  'value'=>$model->Tabla_relacional->campo_de_la_tabla,

)


TENGO MI TABLA UN DECIR PROVEEDOR relacionado a CLIENTE


array(

  'name'=>'cliente',

  'value'=>$model->cliente_name,

)




eso que te puse va dentro de columns en donde indicas tu grid, pero supongamos no te la quieres complicar de esa manera te recomiendo hagas un SQL, ¿como?, en el método search() de tu model que quieres indicar ese grid, indica un inner join a la tabla que quieras, supongamos




select p.nombre, p.apellido, c.cliente  from Persona p 

inner join cliente c c.id_pk on = p.id_pk_cliente



Con eso nada mas debes de inicar una propiedad en tu archivo model para poder usar el campo cliente en tu model dentro de la clase pones public $cliente;, y claro lo indicas dentro de search en el método rules, sino no te va a buscar cuando por el campo cliente, y en tu grid, mandas llamas ‘cliente’, pero para eso en tu model en el método search, debes de indicar el SQL, ¿como se indica?, de esta forma:




$criteria->sql = "select p.nombre, p.apellido, c.cliente  from Persona p"

$criteria->join = "inner join cliente c c.id_pk on = p.id_pk_cliente"


recuerda que las llamadas a compare $criteria->compare pertenen a los where entonces ahí pondras


$criteria->compare('p.nombre',$this->nombre);

$criteria->compare('p.apellido',$this->apellido);

$criteria->compare('c.cliente',$this->cliente);



y LISTO!!!!, funciona tu busqueda por relación, y ya haces inners, los que tu quieras hacer, o vistas, lo que quieras mostrar en tu grid es fácil y simple, de la otra manera, tienes que jugar con las relaciones indicadas dentro del método de tu model relations, como te lo dijo a18327 lml