Bonjour, Dans mon fichier moduleTable.class.php, je souhaite exécuter la requête de sélection B si la requête A ne retourne aucun résultat. Comment puis-je imbriquer les requêtes ?
Bonjour, Dans mon fichier moduleTable.class.php, je souhaite exécuter la requête de sélection B si la requête A ne retourne aucun résultat. Comment puis-je imbriquer les requêtes ?
La tu exagères un peu, non ?
Dans ton modèle matableTable.class.php
Tu crées une méthode pour récupérer les données (doMesDonnee).
Tu fais ta première requête en DQL sans l'exécuter.
Tu utilises un count() sur ce DQL pour avoir le nombre d'enregistrement, s'il est supérieur à zéro, tu fais un exécute dessus que tu retournes.
Et s'il est à zéro, tu crées ton deuxième DQL que tu exécutes et tu retournes.
J'ai juste un doute sur les performances au niveau de l'intérêt du count plutôt que d'exécuter le premier DQL et de voir s'il est vide. Il faudra voir s'il risque souvent d'être vide, si non, il sera peut-être plus intéressant de faire la requête et de vérifier s'il y a un retour. Tous dépend de ton appli, il n'y a que toi qui peut voir et faire des essais.
J'ai fait ceci:
Ça n'a pas généré d'erreur, je suppose donc que ça marche, car d'après mes fixtures et le résultat retourné, c'est la deuxième requête qui a été exécutée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public function getMostPopular() { $q = $this->createQuery('p') ->where('p.rank != ?', '') ->limit(sfConfig::get('app_max_homepage_recent')) ->orderBy('p.rank DESC'); if(count($q)<3) { $q = $this->createQuery('p') ->where('p.selfrank != ?', '') ->limit(sfConfig::get('app_max_homepage_popular_programmes')) ->orderBy('p.selfrank DESC'); } return $q->execute(); }
Ceci
me semble faux, et il est possible que tes fixatures et ce code te retourne ce que tu a envie de voir, essaye de faire s'afficher la première requête... pour voir. Marche pas ! c'est bien ce que je craignais, il y avait 50% de chance que ton unique essai fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(count($q)<3)
Je te proposerais plutôt comme code pour le if
qui, là, va faire la requête en sql et vérifier dans la table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(3 > $q->count() )![]()
Ok, je prends. Merci beaucoup
Partager