Bonjour,

Je me trouve confronté à un problème assez "conséquent". Je m'explique.

Technologies utilisées : Php, Symfony 1.0, MySQL, Propel

Les utilisateurs doivent pouvoir via une interface, générer automatiquement des requêtes personnalisées sur la base de donnée et de renvoyer un CSV avec les informations demandées via checkbox.


Exemple : Extraction personnalisée sur Individu

Doit me renvoyer une requête du genre
Civilite = Mme AND (Pays = France OR Pays = BELGIQUE)

Pour l'instant, je générais des requêtes via les criterias de Propel en regardant l'opérateur à n-1 pour ajouter un criteria addOr au lieu de addAnd.

Le problème c'est que pour cet exemple il me sort alors :
(Civilite = Mme AND Pays = France) OR Pays = BELGIQUE

Ce qui fait que je me retrouve avec des Mr dans ma requête.

On peut ajouter des critères de sélection via un bouton, ce qui rajoute une ligne avec un opérateur sur la ligne précédente.



Les opérateurs proposés : ET, OU, SAUF


Le problème c'est que je ne vois pas comment construire le schéma basique qui me permettrait de générer, par la suite, une requête personnalisée plus longue et plus complexe.
Je dois prendre en compte tout les schémas possible et je n'arrive pas à créer une fonction qui permette que toutes mes requêtes soient correctement organisé en fonction de mes opérateurs (ET, OU, SAUF).


Extrait de mon code de traitement :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
	foreach($types as $key => $type){
		// Recherche de loperateur
		$operateur = 'addAnd';
 
		if ($key > 0 && $operateurs[$key-1] == 'OU') {
			$operateur = 'addOr';
		}
 
		$crit = 'EQUAL';
 
		if($key > 0 && $criterias[$key]!=''){
			if ($operateurs[$key-1] == 'SAUF') {
				$crit = 'NOT_EQUAL';
			}
		}else{
			if ($key > 0 && $operateurs[$key-1] == 'SAUF') {
				$crit = 'ISNOTNULL';
			}else{
				$crit = 'ISNULL';
			}
		}
 
 
 
		switch ($type) {
		//en fonction des types je génére des critérias exemple:
		    case "adresse":
		    case "nom":
		    case "prenom":
		          $typeContante = constant ('IndividuPeer::'.strtoupper ($type));
		          if($key>0){
                                if($criterias[$key]=='' && $operateurs[$key-1] == 'SAUF')
                                         $criterionTemp = $criteria->getNewCriterion ($typeContante, Criteria::ISNOTNULL);
                                else if($criterias[$key]=='' && $operateurs[$key-1] != 'SAUF')
                                         $criterionTemp = $criteria->getNewCriterion ($typeContante, Criteria::ISNULL);
                                else if($criterias[$key]!='' && $operateurs[$key-1] == 'SAUF')
                                      $criterionTemp = $criteria->getNewCriterion ($typeContante, '%'.$criterias[$key].'%', Criteria::NOT_LIKE);
                                else
                                      $criterionTemp = $criteria->getNewCriterion ($typeContante, '%'.$criterias[$key].'%', Criteria::LIKE);
                       }else{
                                 if($criterias[$key]=='')
                                        $criterionTemp = $criteria->getNewCriterion ($typeContante, Criteria::ISNULL);
                                 else
                                        $criterionTemp = $criteria->getNewCriterion ($typeContante, '%'.$criterias[$key].'%', Criteria::LIKE);
                        }
                        if ($key == 0) 
                            $criteria->addAscendingOrderByColumn($typeContante);
			    break;
                 }
 
                  if ($key > 0)
			$criterion->$operateur($criterionTemp);
		else{
                	$criterion = $criterionTemp;
		}
}