该扩展名为yii Activerecord提供了统一的搜索模型。
有关许可信息,请检查许可证文件。
安装此扩展程序的首选方法是通过作曲家。
要么运行
php composer.phar require --prefer-dist yii2tech/ar-search
或添加
"yii2tech/ar-search" : " * "需要您的作曲家的要求。
该扩展名通过特殊模型类yii2techarsearchActiveSearchModel为yii activerecord提供了统一的搜索模型。
该模型能够从yii2techarsearchActiveSearchModel::$model中获取其属性,验证规则和过滤逻辑。因此,您无需声明分离的模型类即可进行搜索和定义过滤器逻辑。例如:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel选择“从”模型的所有“安全”属性,并将其用作自己的属性。因此,您可以使用任何属性,该属性在此类范围中相关的ActiverEcord模型中标记为“安全”。例如:
<?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 ;撰写Web表单时,可以使用继承的属性,这些属性应收集过滤器数据。例如:
<?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 (); ?>属性标签和提示也来自“从”模型。
yii2techarsearchActiveSearchModel的主要方法是search() 。它从给定的数据数组加载过滤器属性,验证它们一个创建yiidataActiveDataProvider实例,将自己的属性应用于查询过滤器条件。
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 。默认情况下,将使用yiidbQueryInterface::andFilterWhere()用于过滤器组成。对于“字符串”属性,它将与“类似”运算符一起使用。如果可用,将使用“整数”和“ float”(“ double”)方法andFilterCompare() 。
小心!不要滥用ActiveSearchModel使用情况。当搜索逻辑是微不足道时,它的设计仅涵盖了最简单的情况。您应该始终创建一个分离的搜索模型,以防万一,它需要复杂的搜索查询组成逻辑。
您可能需要更改由search()方法创建的数据提供商的某些设置:更改分页或排序设置等。您可以通过yii2techarsearchActiveSearchModel::$dataProvider来执行此操作。例如:
<?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` 您可以使用yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY事件来调整搜索查询实例,以添加关系急切的加载或永久条件。例如:
<?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 ]);
});您也可以通过yii2techarsearchActiveSearchModel::$dataProvider直接指定查询对象。例如:
<?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 ]);
},
]);您可以通过yii2techarsearchActiveSearchModel::$filterOperators控制用于查询过滤的操作员。它定义了属性类型与要与yiidbQueryInterface::andFilterWhere()一起使用的操作员之间的映射。每个值可以是标量操作员名称或PHP回调,接受查询实例,属性名称和值。例如:
<?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允许使用查询的andFilterCompare()方法对属性进行过滤(例如: yiidbQuery::andFilterCompare() ),允许在格式中指定过滤器: {operator}{value} (例如: >10 , <=100和ON)。 yii2techarsearchActiveSearchModel::$compareAllowedAttributes允许使用此类比较的属性名称列表。例如:
<?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.
],
]);您可以将compareAllowedAttributes设置为* ,这表明将允许使用任何浮点或整数属性进行比较。
注意:
yii2techarsearchActiveSearchModel::$filterOperators优先于yii2techarsearchActiveSearchModel::$compareAllowedAttributes。
尽管在大多数情况下,设置yii2techarsearchActiveSearchModel::$model是配置ActiveSearchModel实例的最快方法,但这不是强制性的。您可以避免设置“从”模型,并直接配置所有相关属性。例如:
<?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 ]);
},
]);