Búsquedas Relacionales


(Curro Fornes) #1

Buenas a todos,

Soy un poco nuevo en Yii, y cuando quiero realizar algo un poco más complicado se me escapa de las manos.

Veréis, el problema es el siguiente:

Tengo una tabla en la base de datos para modelar Documentos. Su clave primera es "id".

Tengo otra tabla en la base de datos para modelar Clases. Su clave primaria es "id".

Tengo otra tabla llamada RelDocumentoClase, donde voy añadiendo registros para anotar que un número de ejemplares (num_ejemplares) de un determinado Documento (id_documento) pertenece a una Clase (id_clase).

Las relaciones que tengo en el modelo RelDocumentoClase son:




'clase' => array(self::BELONGS_TO, 'Clase', 'id_clase'),

'documento' => array(self::BELONGS_TO, 'Documento', 'id_documento'),



Esto funciona bien. Si quiero ver el listado completo de Documentos que hay en una clase concreta, utilizo esto:




$criteria = new CDbCriteria();

$criteria->select = 'id, id_clase, id_documento, sum(num_ejemplares) AS total';

$criteria->condition = 'id_clase=:id AND estado=:estado';

$criteria->group = 'id_documento';

$criteria->params = array(':id'=>$this->id, ':estado'=>RelDocumentoClase::ESTADO_PENDIENTE);


$dataProvider=new CActiveDataProvider('RelDocumentoClase', array(

      	'criteria'=>$criteria,

      	'pagination'=>false,

)); 



Mi problema viene cuando no quiero obtener todos los documentos que hay en una clase, sino solo los que en el título del documento (Documento.titulo) aparezca una palabra, es decir, realizar una búsqueda.

Lo estoy intentando hacer de esta forma:




$criteria = new CDbCriteria();

$criteria->select = 't.id, t.id_clase, t.id_documento, sum(t.num_ejemplares) AS total';

$criteria->condition = 't.id_clase=:id AND t.estado=:estado';

$criteria->group = 't.id_documento';

$criteria->params = array(':id'=>$id, ':estado'=>RelDocumentoClase::ESTADO_PENDIENTE);


$criteria->with = array(

   'documento', 

);

			

$criteria->together = true;


$criteria ->addCondition("documento.titulo LIKE '%'");

		

$criteria->params = array(':filterProperties' => $_POST['Clase']['filterProperties']);


$docDataProvider=new CActiveDataProvider('RelDocumentoClase', array(

	'criteria'=>$criteria,

       	'pagination'=>false,

)); 




La variable :filterProperties contiene el texto que quiero buscar.

He comprobado que tanto el $id de la clase como el texto que quiero buscar se están pasando bien, pero esto siempre me devuelve 0 resultados, aún sabiendo que debería devolver alguno.

Alguién sería tan amable de indicarme qué estoy haciendo mal?

Muchas gracias.


(Ricobregon) #2

Hay algo que me llama la atención:

El atributo $criteria->params está siendo sobreescrito, así que sólo se usará la asignación ulterior.


(Ricobregon) #3

Pregunta:

Veo que las diferentes condiciones incluyen los parámetros "id" y "estado", en qué condición se está incluyendo el parámetro ":filterProperties"?

Saludos.


(Curro Fornes) #4

Genial! El problema era lo de params… Yo creía que se iban acumulando.

Con respecto a lo de filterProperties, he tenido una equivocación al escribirlo, la condición era:




$criteria ->addCondition("documento.titulo LIKE '%' || :filterProperties || '%');



Muchas gracias, de verdad.

Un saludo.


(Ricobregon) #5

Con gusto, por acá estaremos con la comunidad para apoyarnos :)