17.8.1.3 Recherche avec critères sur des attributs de document
Dans le cas où une famille d'appartenance est précisée, il est possible d'utiliser les attributs de cette famille comme critères.
$searchedName='jean'; $s=new SearchDoc("","MY_CONTACT"); // recherche sur les document de la famille "MY_CONTACT" $s->addFilter("my_firstname ~* 'jean'"); // prénom contient jean $s->setObjectReturn(true); $s->search(); while ($doc=$s->nextDoc()) { print "$k)".$doc->getTitle()."(".$doc>getRawValue("my_mail","nomail").")\n"; }
L'exemple ci-dessus montre la recherche de toutes les personnes dont le prénom
contient jean. Les filtres ajoutés au moyen de la méthode addFilter
établissent une conjonction de conditions (opérateur and
). Pour établir une
disjonction, il faut l'écrire manuellement en SQL en utilisant l'opérateur
logique or
.
Les opérateurs sql utilisés doivent être compatibles avec les types des attributs stockés en base de données.
$s=new SearchDoc("","MY_CONTACT");// famid : toute famille $s->addFilter("my_firstname ~* 'jean|patrick'"); // prénom contient jean ou patrick // mail fini par .org ou cp commence par 31// $s->addFilter("(my_mail ~ '\.org$') or (my_postalcode ~ '^31')"); $s->setObjectReturn(true); $s->search(); while ($doc=$s->nextDoc()) { print "$k)".$doc->title."(".$doc->getRawValue("my_mail","nomail").':'. $doc->getRawValue("my_postalcode").")\n"; }
Note : Les types docid
sont enregistrés au format text
dans la
base de données.
17.8.1.3.1 Recherche sur des attributs de type énumérés (getKindDoc)
Pour rechercher des documents suivant des attributs de type énumérés, une
fonction simplifiée de recherche existe. Cette fonction getKindDoc()
a pour
but de construire la règle de filtrage adéquate en tenant compte de la
hiérarchie dans ce type d'attribut.
include_once("FDL/Class.Doc.php"); include_once("FDL/Lib.Dir.php"); $tdoc=getKindDoc("", "USER", // nom de la famille "us_type", // attribut énuméré sur lequel s'applique le filtrage "chefserv" // clef à rechercher ); while (list($k, $v) = each($tdoc)) { print "$k)".$v["title"]."(".getv($v,"us_mail","nomail").")\n"; }
Cet exemple permet de sélectionner la liste des chefs de service. Le chef de service a pour clef 'chefserv'.
17.8.1.3.2 Recherche dans un array
Pour une famille avec un tableau contenant une liste de valeur, le filtre Postgresql suivant permet de filtrer les documents dont une des valeurs est égale à une valeur précise :
$s->addFilter("string_to_array(%s,E'\\n') && '{%s}'", $attrId, $expectedValue);
Si le tableau contient une liste d'identifiants de document, le filtre Postgresql suivant peut être utilisé pour retourner tous les documents contenant cet identifiant :
$s->addFilter("%s ~ E'\\\\y%d\\\\y'", $attrId, $expectedInitid);
Ce filtre ne peut être utilisé qu'avec des valeurs qui n'ont pas d'espace. Le filtre précédent fonctionne aussi mais il est un peu moins performant.
17.8.1.3.3 Recherche avec jointure
Il est possible d'ajouter des critères portant sur une autre table en utilisant un mécanisme de jointure. Ce mécanisme ne permet pas de récupérer des données provenant de cette autre table mais permet de les utiliser comme critère de recherche.
Exemple : recherche des documents qui ont dans l'historique un ordre de suppression émis par l'utilisateur courant
$s=new searchDoc(); $s->trash='only'; // recherche dans les documents supprimés (mis dans la corbeille) $s->join("id = dochisto(id)"); $s->addFilter("dochisto.uid = %d",$this->getSystemUserId()); $s->addFilter("dochisto.code = 'DELETE'"); $s->distinct=true; $result= $s->search();
Il est notamment possible d'utiliser, entre autres, les tables dochisto
,
docutag
ou docrel
pour établir un critère de jointure.
Attention : On ne peut utiliser qu'un seul ordre "join" par requête.
Il est aussi possible de créer un critère sur une famille liée :
$s=new SearchDoc($dbaccess,"ZOO_ANIMAL"); // la famille ZOO_ANIMAL est liée à la famille ZOO_ESPECE via l'attribut AN_ESPECE $s->join("an_espece::int = zoo_espece(initid)"); $s->addFilter("zoo_espece.es_ordre='Rongeur'"); $s->setObjectReturn(true); $s->search(); while ($doc=$s->nextDoc()) { print $doc->getTitle()."\n"; }
Dans l'exemple décrit on recherche les animaux dont l'ordre déclaré dans
l'espèce est 'Rongeur'. Attention à bien lier les deux famille à travers
l'identificateur initial (initid
) dans le cas des relations créées avec les
options par défaut.
17.8.1.3 Recherche de famille
Pour rechercher des familles, il faut utiliser la valeur "-1" lors de la construction de l'objet recherche.
$sd=new SearchDoc("", -1); // toutes les familles $sd->search();