[MySQL - PhP - Propel] Génération de requêtes personnalisés
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.
http://img4.hostingpics.net/pics/358...leindividu.jpg
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.
http://img4.hostingpics.net/pics/485...leindividu.jpg
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:
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;
}
} |