この拡張機能は、Yii ActivereCordの統一された検索モデルを提供します。
ライセンス情報については、ライセンスファイルを確認してください。
この拡張機能をインストールするための好ましい方法は、Composerを通じてです。
どちらか走ってください
php composer.phar require --prefer-dist yii2tech/ar-search
または追加します
"yii2tech/ar-search" : " * "Composer.jsonの要求セクションに。
この拡張機能は、特別なモデルクラスを介してYii ActivereCordの統一された検索モデルを提供します - yii2techarsearchActiveSearchModel 。
このモデルはyii2techarsearchActiveSearchModel::$modelを介して指定された「スレーブ」ソースActiverecordモデルからの属性、検証ルール、およびフィルタリングロジックを取得できます。したがって、フィルターロジックを検索して定義するために分離されたモデルクラスを宣言する必要はありません。例えば:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel 、「スレーブ」モデルのすべての「安全な」属性を選択し、それらを独自の属性として使用します。したがって、このクラスの範囲で関連するActiverCordモデルで「安全」としてマークされる任意の属性を使用できます。例えば:
<?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 、 yii2tech yii2techarsearchActiveSearchModel::$model yii2techarsearchActiveSearchModel::$searchAttributeTypesで指定された属性タイプに基づいて、クエリフィルタリングの洗練されたロジックを使用します。 yii2techarsearchActiveSearchModel::$filterOperators 。デフォルトではyiidbQueryInterface::andFilterWhere()フィルター組成に使用されます。 「文字列」の属性については、「Like」演算子で使用されます。 「整数」および「フロート」(「ダブル」)メソッド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()メソッドを使用して属性のフィルタリングを許可します(例: >10 yii db {operator}{value} :: <=100 yiidbQuery::andFilterCompare() )。このような比較の使用が許可される属性名のリストは、 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::$filterOperatorsyii2techarsearchActiveSearchModel::$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 ]);
},
]);