Esta extensión proporciona un modelo de búsqueda unificado para YII Activerecord.
Para obtener información sobre la licencia, consulte el archivo de licencia.
La forma preferida de instalar esta extensión es a través del compositor.
O CORRE
php composer.phar require --prefer-dist yii2tech/ar-search
o agregar
"yii2tech/ar-search" : " * "a la sección Requerir de su compositor.json.
Esta extensión proporciona un modelo de búsqueda unificado para yii Activerecord a través de la clase de modelo especial - yii2techarsearchActiveSearchModel .
Este modelo puede obtener sus atributos, reglas de validación y filtrar la lógica del modelo ACTIGECORD de origen 'esclavo' especificado a través de yii2techarsearchActiveSearchModel::$model . Por lo tanto, no necesita declarar una clase de modelo separada para buscar y definir una lógica de filtro. Por ejemplo:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel elige todos los atributos 'seguros' del modelo 'esclavo' y los usa como atributos propios. Por lo tanto, puede usar cualquier atributo, que esté marcado como 'seguro' en el modelo de Activerecord relacionado en el alcance de esta clase. Por ejemplo:
<?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 ;Los atributos hereditarios se pueden usar al componer formularios web, que deberían recopilar datos de filtro. Por ejemplo:
<?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 (); ?>Las etiquetas y sugerencias de atributos también se heredan del modelo 'esclavo'.
El método principal de yii2techarsearchActiveSearchModel es search() . Carga los atributos de filtro de la matriz de datos dada, los valida y crea una instancia yiidataActiveDataProvider aplicando atributos propios como condición de filtro de consulta.
ActiveSearchModel utiliza una lógica sofisticada para el filtrado de consultas, basado en los tipos de atributos, especificado por yii2techarsearchActiveSearchModel::$searchAttributeTypes , cuyo valor se extrae de yii2techarsearchActiveSearchModel::$model por predeterminado y la lista de operadores de filtro especificado, especificado, especificado, especificado a través de yii2techarsearchActiveSearchModel::$filterOperators . Por defecto yiidbQueryInterface::andFilterWhere() se utilizará para la composición del filtro. Para los atributos de 'cadena', se utilizará con el operador 'Like'. Para el método 'Integer' y 'Float' ('Double') andFilterCompare() se utilizarán, si está disponible.
¡Aviso! No abuse del uso ActiveSearchModel . Ha sido diseñado para cubrir solo los casos más simples, cuando la lógica de búsqueda es trivial. Siempre debe crear un modelo de búsqueda separado en el caso, requiere una lógica compleja de composición de la consulta de búsqueda.
Es posible que desee cambiar algunas configuraciones del proveedor de datos, creado por el método search() : cambiar la configuración de paginación o clasificar, etc. Puede hacer esto a través de yii2techarsearchActiveSearchModel::$dataProvider . Por ejemplo:
<?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` Puede usar yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY para ajustar la instancia de consulta de búsqueda agregando relación ansiosa o condiciones permanentes. Por ejemplo:
<?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 ]);
}); También puede especificar el objeto de consulta directamente a través de yii2techarsearchActiveSearchModel::$dataProvider . Por ejemplo:
<?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 ]);
},
]); Puede controlar los operadores para que se utilicen para el filtrado de consultas a través de yii2techarsearchActiveSearchModel::$filterOperators . Define una asignación entre el tipo de atributo y el operador que se utilizará con yiidbQueryInterface::andFilterWhere() . Cada valor puede ser un nombre de operador escalar o una devolución de llamada PHP, aceptando una instancia de consulta, nombre y valor del atributo. Por ejemplo:
<?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 permite el filtrado de los atributos utilizando el método andFilterCompare() de la consulta (por ejemplo: yiidbQuery::andFilterCompare() ), que permite especificar el valor del filtro en formato: {operator}{value} (por ejemplo: >10 , <=100 y así en). La lista de nombres de atributos, para el cual se permite el uso de dicha comparación, está controlada por yii2techarsearchActiveSearchModel::$compareAllowedAttributes . Por ejemplo:
<?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.
],
]); Puede establecer compareAllowedAttributes a * , que indica que cualquier atributo de flotación o entero se permitirá para comparar.
Nota:
yii2techarsearchActiveSearchModel::$filterOperatorstiene prioridad sobreyii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Aunque en la mayoría de los casos la configuración de yii2techarsearchActiveSearchModel::$model es una forma más rápida de configurar la instancia ActiveSearchModel , no es obligatorio. Puede evitar la configuración del modelo 'esclavo' y configurar todas las propiedades relacionadas con la búsqueda directamente. Por ejemplo:
<?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 ]);
},
]);