Expression de recherche
-
Les expressions de recherche sont utilisées par Data_Link::count(), Data_Link::search(), Data_Link::searchOne(), Data_Link::select(), pour récupérer des objets respectant certains critères de recherche, présentés ici sous forme de tableaux récursifs.
Les mêmes exemples sont repris pour les deux modes recherches par objet de recherche ou expression de recherche.
Voir aussi : Objet de recherche, Dao.
Expressions simples
Soit deux classes PHP représentative des types de données qu’on peut utiliser :
use ITRocks\Framework\Dao; class Man { /** * @var integer */ public $age; /** * @var string */ public $name; /** * @link Object * @var Town */ public $town; /** * @link Map * @var Town[] */ public $visited; } class Town { /** * @var string */ public $name; }
Voici différents exemples de recherches simples :
// Recherche d'un homme nommé Roger /** @var $man_named_roger Man */ $man_named_roger = Dao::searchOne(['name' => 'Roger'], Man::class); // Recherche des hommes qui ont 20 ans /** @var $men_being_20 Man[] */ $men_being_20 = Dao::search(['age' => 20], Man::class);
Recherche dans des objets contenus
// Recherche d'une ville nommée Rimont /** @var $city_named_rimont City */ $city_named_rimont = Dao::searchOne(['name' => 'Rimont'], City::class); // Recherche des hommes habitant Rimont /** @var $men_living_in_rimont Man[] */ $men_living_in_rimont = Dao::search(['town' => $city_named_rimont], Man::class); // Recherche des hommes qui visitent Rimont /** @var $men_visiting_rimont Man[] */ $men_visiting_rimont = Dao::search(['visited' => $city_named_rimont], Man::class); // Les deux mêmes recherches, sans passer par un objet City $men_living_in_rimont = Dao::search(['town.name' => 'Rimont'], Man::class); $men_visiting_rimont = Dao::search(['visited.name' => 'Rimont'], Man::class);
Recherches multi-critères
Lorsque plusieurs critères sont donnés, seuls les objets répondant à tous les critères sont lus :
// Recherche d'un homme nommé Roger et qui a 30 ans /** @var $man_named_roger_being_30 Man */ $man_named_roger_being_30 = Dao::searchOne(['name' => 'Roger', 'age' => 30), Man::class);
Les sous-tableaux peuvent être utilisés pour appliquer d’autres relations entre les critères de recherches :
// Recherche des hommes nommés Roger ou ayant 20 ans /** @var $men_named_roger_or_being_20 Man[] */ $men_named_roger_or_being_20 = Dao::search([_OR => ['name' => 'Roger', 'age' => 20]], Man::class); // Recherche des hommes habitant où ayant visité Rimont /** @var $men_linked_to_rimont Man[] */ $men_linked_to_rimont = Dao::search( [_OR => ['town.name' => 'Rimont', 'visited.name' => 'Rimont']], Man::class ); // Peut être utilisé sans la mention @OR@ car un sous-tableau est par défaut sous cette relation // (plus compact mais moins lisible) $men_named_roger_or_being_20 = Dao::search([['name' => 'Roger', 'age' => 20]], Man::class); $men_linked_to_rimont = Dao::search( [['town.name' => 'Rimont', 'visited.name' => 'Rimont']], Man::class );
Si un sous-tableau vient directement sous un critère de recherche, la relation par défaut est
OR
:
// Recherche des hommes nommés Roger ou Marcel, qui doivent tous avoir 20 ans /** @var $men_named_roger_or_marcel_being_20 Man[] */ $men_named_roger_or_marcel_being_20 = Dao::search( ['name' => ['Roger', 'Marcel'], 'age' => 20], Man::class );
Il n’y a pas de limite dans le niveau de complexité des recherches qu’on peut ainsi réaliser. Mieux vaut indenter un peu, toutefois, et préciser les relations, si l’on veut que tout cela reste lisible pour la maintenance) :
// Recherche des hommes nommés (Roger OU Marcel) ET (habitants de Rimont OU qui ont déjà visité Paris) /** @var $men_with_complex_search Man[] */ $men_with_complex_search = Dao::search( [_AND => [ 'name' => [_OR => ['Roger', 'Marcel']], _OR => [ 'town.name' => 'Rimont', 'visited.name' => 'Paris' ] ]], Man::class ); // Notation compacte (mais moins lisible) $men_with_complex_search = Dao::search( [ 'name' => ['Roger', 'Marcel'], [ 'town.name' => 'Rimont', 'visited.name' => 'Paris' ] ], Man::class );
Comparer deux champs date
Pour comparer deux champs date d’un objet dans une requête de cette forme
WHERE date1 > date2
:
Dao::search( ['last_update' => Dao\Func::greater(Dao\Func::property('last_synchronization'))], Contract::class );