Cette extension fournit un modèle de recherche unifié pour yii activeRecord.
Pour les informations de licence, vérifiez le fichier de licence.
La façon préférée d'installer cette extension est via le compositeur.
Soit courir
php composer.phar require --prefer-dist yii2tech/ar-search
ou ajouter
"yii2tech/ar-search" : " * "à la section requise de votre compositeur.json.
Cette extension fournit un modèle de recherche unifié pour yii activeRecord via une classe de modèle spéciale - yii2techarsearchActiveSearchModel .
Ce modèle est capable de récupérer ses attributs, les règles de validation et le filtrage de la logique du modèle activecord source «esclave» spécifié via yii2techarsearchActiveSearchModel::$model . Ainsi, vous n'avez pas besoin de déclarer une classe de modèle séparée pour rechercher et définir une logique de filtre. Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel choisit tous les attributs «sûrs» du modèle «esclave» et les utilise comme propres attributs. Ainsi, vous pouvez utiliser n'importe quel attribut, qui est marqué comme «sûr» dans le modèle ActiveRecord connexe dans la portée de cette classe. Par exemple:
<?php
namespace appmodels;
// ActiveRecord to be searched:
class Item extends yiidb ActiveRecord
{
public function rules ()
{
return [
[[ ' name ' , ' status ' , ' price ' ], ' required ' ],
[ ' name ' , ' string ' ],
[ ' status ' , ' integer ' ],
[ ' price ' , ' number ' ],
];
}
}
use yii2techarsearch ActiveSearchModel ;
// Create search model for declared ActiveRecord:
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
// safe attributes of `Item` are inherited:
$ searchModel -> name = ' Paul ' ;
$ searchModel -> price = 10.5 ;Les attributs hérités peuvent être utilisés lors de la composition des formulaires Web, qui doivent collecter les données de filtre. Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiiwidgets ActiveForm ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
?>
<?php $ form = ActiveForm :: begin (); ?>
<?= $ form -> field ( $ model , ' name ' )-> textInput () ?>
<?= $ form -> field ( $ model , ' price ' )-> textInput () ?>
...
<?php ActiveForm :: end (); ?>Les étiquettes et les conseils d'attribut sont également hérités du modèle «esclave».
La méthode principale de yii2techarsearchActiveSearchModel est search() . Il charge les attributs de filtre à partir du tableau de données donné, les valide et crée une instance yiidataActiveDataProvider appliquant ses propres attributs en tant que condition de filtre de requête.
ActiveSearchModel uses a sophisticated logic for the query filtering, based on the attribute types, specified by yii2techarsearchActiveSearchModel::$searchAttributeTypes , which value is extracted from yii2techarsearchActiveSearchModel::$model by default and filter operators list, specified via yii2techarsearchActiveSearchModel::$filterOperators . Par défaut, yiidbQueryInterface::andFilterWhere() sera utilisé pour la composition du filtre. Pour les attributs «String», il sera utilisé avec l'opérateur «Like». Pour la méthode 'Integer' et 'Float' ('Double') andFilterCompare() sera utilisé, s'il est disponible.
Attention! N'abusez pas d'utilisation ActiveSearchModel . Il a été conçu pour couvrir uniquement les cas les plus simples, lorsque la logique de recherche est triviale. Vous devez toujours créer un modèle de recherche séparé dans le cas, il nécessite une logique complexe de composition de la requête de recherche.
Vous souhaiterez peut-être modifier certains paramètres du fournisseur de données, créé par la méthode search() : modifier la pagination ou les paramètres de tri, etc. Vous pouvez le faire via yii2techarsearchActiveSearchModel::$dataProvider . Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' dataProvider ' => [
' class ' => ' yiidataActiveDataProvider ' ,
' pagination ' => [
' defaultPageSize ' => 40
],
],
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams );
echo $ dataProvider -> pagination -> defaultPageSize ; // outputs `40` Vous pouvez utiliser yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY l'événement pour ajuster l'instance de requête de recherche en ajoutant des conditions de chargement ou permanente de la relation. Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
use yii2techarsearch ActiveSearchEvent ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
]);
$ searchModel -> on ( ActiveSearchModel :: EVENT_AFTER_CREATE_QUERY , function ( ActiveSearchEvent $ event ) {
$ event -> query
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
}); Vous pouvez également spécifier l'objet de requête directement via yii2techarsearchActiveSearchModel::$dataProvider . Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' model ' => Item :: className (),
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]); Vous pouvez contrôler les opérateurs à utiliser pour le filtrage de requête via yii2techarsearchActiveSearchModel::$filterOperators . Il définit un mappage entre le type d'attribut et l'opérateur à utiliser avec yiidbQueryInterface::andFilterWhere() . Chaque valeur peut être un nom d'opérateur scalaire ou un rappel PHP, acceptant l'instance de requête, le nom et la valeur de l'attribut. Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' filterOperators ' => [
ActiveSearchModel :: TYPE_STRING => ' = ' , // use strict comparison for the string attributes
ActiveSearchModel :: TYPE_INTEGER => function ( yiidb ActiveQueryInterface $ query , $ attribute , $ value ) {
if ( $ attribute === ' commentsCount ' ) {
$ query -> andHaving ([ ' commentsCount ' => $ value ]);
} else {
$ query -> andFilterWhere ([ $ attribute => $ value ]);
}
},
],
]); ActiveSearchModel permet le filtrage des attributs à l'aide de la méthode andFilterCompare() de la requête (par exemple: yiidbQuery::andFilterCompare() ), qui permet de spécifier la valeur du filtre au format: {operator}{value} (par exemple: >10 , <=100 et ainsi). La liste des noms d'attributs, pour laquelle l'utilisation d'une telle comparaison est autorisée est contrôlée par yii2techarsearchActiveSearchModel::$compareAllowedAttributes . Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' compareAllowedAttributes ' => [
' price ' // allow compare for ' price ' only, excluding such fields like ' categoryId ' , ' status ' and so on.
],
]); Vous pouvez définir compareAllowedAttributes à * , ce qui indique que tout flot ou attribut entier sera autorisé pour la comparaison.
Remarque:
yii2techarsearchActiveSearchModel::$filterOperatorsprends priorité suryii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Bien que dans la plupart des cas, la configuration de yii2techarsearchActiveSearchModel::$model est un moyen le plus rapide de configurer une instance ActiveSearchModel , elle n'est pas obligatoire. Vous pouvez éviter la configuration du modèle «esclave» et configurer directement toutes les propriétés liées à la recherche. Par exemple:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' searchAttributeTypes ' => [
' id ' => ActiveSearchModel :: TYPE_INTEGER ,
' name ' => ActiveSearchModel :: TYPE_STRING ,
' price ' => ActiveSearchModel :: TYPE_FLOAT ,
],
' rules ' => [
[ ' id ' , ' integer ' ],
[ ' name ' , ' string ' ],
[ ' price ' , ' number ' ],
],
' compareAllowedAttributes ' => [],
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]);