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();
×