Busqueda de campo

Hola espero que esten bien, ando buscando la manera de realizar una búsqueda de un entero a un string digamos que tengo un campo que es numerico y si hago la búsqueda por 1,2,6,15 etc., si me muestra el registro indicado, para esto en el grid lo modifique a un combobox para que el usuario no tenga que escribir el valor, pero me cambiaron las cosas, yo en el grid muestro un texto y en la parte de arriba donde aparece la caja de texto en vez de que sea el número desean que busque por un texto, como puedo convertir o hacer que busque en criteria el texto en vez del número, se preguntaran que porque no guardo el texto en vez del número, la respuesta es que obtengo el valor de otra tabla en la cual los indico en un combobox y es por eso que se ingresan los datos como tipo entero, hace mucho vi en el foro como hacerle para hacer esta búsqueda pero la verdad no encontre el post. Saludos…

podrias hacer un cast en la comparacion del metodo seach…


(int)$variable

Digamos que tengo en el grid en donde deseo hacer eso 3 registros y en esos tres mi campo se llama id_grado, en el grid muestro el texto, Grado1, Grado2 y Grado3, como es un id, estoy buscando por un dato númerico, lo que me mencionas jack si se me habia ocurrido pero tengo duda en criteria por decir si kiero buscar Grado1 que tiene un value de 1, en vez de poner 1 quiero escribir en la caja de texto asi tal cual Grado1 y me haga al búsqueda y solo me muestre ese campo, espero darme mas a entender, a lo que me imagino sería con


(string)$variable

o existe alguna otra forma?. Saludos…

He quedado un tanto confundido… ¿? O_o

Tengo las siguientes tablas:




Tabla Grado

id_grado, nombre_grado, id_categoria, activo.


Tabla Plaza

id_plaza, nombre_plaza, id_grado, status, activo.



En mi módulo Plaza, hago llamada a lo que almacene en la tabla Grado, nada mas mando llamar el id_grado, y nombre_grado, para yo cambiarlo a un combobox y mostrarlo en el módulo de Plaza.





<?php echo $form->labelEx($model,'id_grado'); ?>

<?php echo $form->dropDownList($model,'id_grado',CHtml::listData(Grado::model()->findAll(), 'id_grado','nombre_grado'),array('empty'=>array(NULL=>'-- Seleccione --'))); ?>

<?php echo $form->error($model,'id_grado'); ?>




Así ya muestro en un combo el grado almacenado como en la imágen.

Como vez ya almaceno un registro y ese registro lo muestro en un grid, pero en el grado yo indico una relacion para que en vez de mostrarle el valor de id_grado, de la tabla Grado, me muestre el texto, es por eso que en la imágen anterior en el grid cuando deseo hacer una búsqueda, tengo que poner el id correspondiente, pero en criteria no se si exista una forma para definir que en vez de escribir el id yo ponga el texto, ojala me haya dado a entender. Saludos

Podrias escribir el criteria que tienes para dar el resultado del grid ?

Dentro de criteria tengo esto:




public function search()

	{

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

		// should not be searched.


		$criteria=new CDbCriteria;


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

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

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

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

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

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

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

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

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

		

		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

		));

	}



Dentro mi grid en el archivo admin, indico la relación con la tabla Grado:




array(

                  'name'=>'id_grado',

                  'value'=>'$data->idGrado0->nombre_grado',

                  'sortable'=>'true',

                ),



Esta es como tengo mi relación:




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(

			'convocatoriaPlazas' => array(self::HAS_MANY, 'ConvocatoriaPlaza', 'id_plaza'),

			'idGrado0' => array(self::BELONGS_TO, 'Grado', 'id_grado'),

			'usuarioAlta0' => array(self::BELONGS_TO, 'Usuario', 'usuario_alta'),

			'usuarioModificacion0' => array(self::BELONGS_TO, 'Usuario', 'usuario_modificacion'),

		);

	}



El que tengo como número en la bse de datos es id_grado, y es el que necesito que me busque el texto que se muestra no por el id, porque imáginemos que el usuario no se acuerda del id, que de hecho sería dificil si tienes muchos ids, pero por un texto busco Gra asi me buscara x registros que tengan el registro Gra. Saludos.

Creo q podria ser entonces de la siguiente manera…


//Agregas esto a tu search()

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

$criteria->addSearchCondition('idGrado0.nombre_grado', (string)$this->id_grado, true);

Eso supongo que el valor escrito en el campo del filtro lo compararia con el atributo nombre_grado del modelo Grado… tambien podrias utilizar condition en lugar de addSearchCondition …

Hola jack perdona por no contestar, es que me ocupe en otras ondas pero sobre el código que me indicas no me funciono logicamente se ve que si funcionaría, pero aplicandolo en criteria no lo puse asi como lo tienes tal cual ya que mi relación y campos asi se llaman, entonces me arroja este error:

Error 500: <h1>CDbException</h1>

<p>CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[42P01]: Undefined table: 7 ERROR: falta una entrada para la tabla «idgrado0» en la cláusula FROM LINE 1: …ON ("t"."id_grado"="idGrado0"."id_grado") WHERE (idGrado0.n…^. The SQL statement executed was: SELECT COUNT(DISTINCT "t"."id_plaza") FROM "plaza" "t" LEFT OUTER JOIN "grado" "idGrado0" ON ("t"."id_grado"="idGrado0"."id_grado") WHERE (idGrado0.nombre_grado LIKE

La verdad no entiendo porque me lo arrojo como te digo viendo la manera en que me dijiste que lo indicara se ve locamente correcta, ojala me puedas ayudar a acomodar esto. Saludos.

la relacion idGrado0 existe o como lo tienes?? porque me guie por lo que habias escrito antes

Mi relación la tengo indicada de esta forma:




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(

			'convocatoriaPlazas' => array(self::HAS_MANY, 'ConvocatoriaPlaza', 'id_plaza'),

			'idGrado0' => array(self::BELONGS_TO, 'Grado', 'id_grado'),

			'usuarioAlta0' => array(self::BELONGS_TO, 'Usuario', 'usuario_alta'),

			'usuarioModificacion0' => array(self::BELONGS_TO, 'Usuario', 'usuario_modificacion'),

		);

	}