[Résolu] Besoin d'aide avec CDbCriteria

Bonjour à tous,

J’ai actuellement un petit problème avec yii, j’aimerais effectuer un filtrage de mes articles. Tout mes articles sont affichés sur index.php?r=films. J’ai voulu rajouter un “filtrage” des articles en faisant un truc du genre index.php?r=films&realisateur=blabla.

Voici mon code dans mon controller :




<?php


public function actionIndex() {

    

$criteria=new CDbCriteria(array(

			

			'order'=>'Date_de_sortie DESC',

			

		));

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

			$criteria->addSearchCondition('Realisateurs',utf8_decode (base64_decode($_GET['realisateur']) ));


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

			/*'pagination'=>array(

				'pageSize'=>Yii::app()->params['postsPerPage'],

			),*/

			'criteria'=>$criteria,

		));

                

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

'dataProvider' => $dataProvider,

));

}

?>



J’utilise donc :

[CODE]if(isset($_GET[‘realisateur’]))

		&#036;criteria-&gt;addSearchCondition('Realisateurs',utf8_decode (base64_decode(&#036;_GET['realisateur']) ));[/CODE]

Pour effectuer mon triage mais cela ne fonctionne pas (aucun résultat trouvé).

J’aimerais pouvoir effectuer une requete du type : WHERE Realisateur like %$realisateur%.

Je ne vois pas d’ou viens le problème, si vous pouviez m’éclaire …

bonjour,

depuis peu je me suis tourné aussi sur Yii que je trouve de plus en plus intéressant…

Pour ton soucis, je pense que tu devrais remplacer le "addSearchCondition" par quelque chose du genre:




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

$criteria->condition = 'realisateur = :realisateur';

$criteria->params = array (':realisateur' => $_GET['realisateur']);

Salut co-k-ine,

je te conseillerai d’activer les logs afin de pouvoir vérifier quelle est la requête SQL générée par Yii. Pour cela il faut modifier la configuration de la sorte :


	

		'db'=>array(

			'connectionString' => 'mysql:host=localhost;dbname=dbname',

			'emulatePrepare' => true,

			'enableParamLogging'=> true,

			'enableProfiling'=> true,

			'username' => 'root',

			'password' => '********',

			'charset' => 'utf8',


		),

		'log'=>array(

			'class'=>'CLogRouter',

			'routes'=>array(

				array(

					'class'=>'CFileLogRoute',

					'levels'=>'error, warning',

				),

				array(

					'class'=>'CWebLogRoute',

				),

				array(

					'class'=>'CProfileLogRoute',

					'levels'=>'trace,error,info,warning',

				),					

			),

		),



Ainsi tu pourras vérifier que la requête SQL est bien celle que tu souhaites.

@shizo971 : la modification que tu proposes va créer une requête comportant une condition ‘=’ alors que la méthode addSearchCondition du CActiveRecord rajoute un condition ‘LIKE’.

ciao

B)

Encore une fois raoul tu as été de très bon conseille, merci beaucoup !

Le log m’as pas mal aidé. Enfaite l’erreur venais des caractères, j’avais juste à faire :

&#036;criteria-&gt;addSearchCondition('Realisateurs',&#036;_GET['realisateur']) ; (il fallait que j’enlève le utf8_decode() & base64_decode(); qui gainait l’encodage des caractères.

Je te remercie :)

Merci shizo971 pour ta methode, je m’en servirait plus tard dans le script.

EDIT : Je vois que a chaque chargement de page j’ai des requetes sql du type ::

Querying SQL: SHOW COLUMNS FROM `Films`

Ou

Querying SQL: SHOW CREATE TABLE `Films`

Existe-il un moyen de “mettre en cache” ces requêtes, pour éviter qu’elle soit exécuter à chaque fois. Je sais que sur le framework jelix, ils mettent ça dans un fichier .xml

…content que tu aies résolu ton problème ;)

Concernant le cache, tu peux effectivement utiliser le cache de Yii avec des queries SQL et ainsi, ne pas solliciter te BDD à chaque requête. Je ne l’ai pas encore utilisé, mais ça à l’air intéressant. Pour tout savoir sur le sujet je te conseille un petit tour sur la documentation… ;)

ciao

Ce n’est pas vraiment ce que je cherche. Car la je met en cache la requete sql moi je veux juste éviter de faire un “SHOW table” a chaque requête. Je sais que pour palier à ce problème le framework jelix utilise un fichier xml pour stocker la structure de la table.

Merci encore pour ton aide.

Bonne journée

ah ok … j’avais pas bien compris… regardes du côté du composant CDbConnection et de ses paramètres d’initialisation. Tu trouveras par exemple schemaCachingDuration qui fera peut-être l’affaire.

ciao

B)