Diese Erweiterung bietet ein einheitliches Suchmodell für YII ActiveCord.
Lizenzinformationen überprüfen Sie die Lizenzdatei.
Die bevorzugte Möglichkeit, diese Erweiterung zu installieren, ist über Komponist.
Entweder rennen
php composer.phar require --prefer-dist yii2tech/ar-search
oder hinzufügen
"yii2tech/ar-search" : " * "zum Fordern -Abschnitt Ihres Composers.json.
Diese Erweiterung bietet ein einheitliches Suchmodell für yii ActiveCord über die spezielle Modellklasse - yii2techarsearchActiveSearchModel .
Dieses Modell ist in der Lage, seine Attribute, Validierungsregeln und Filterlogik aus dem "Slave" -Artiverecord -Modell zu filtern, das über yii2techarsearchActiveSearchModel::$model angegeben ist. Daher müssen Sie keine getrennte Modellklasse für die Suche und definieren eine Filterlogik deklarieren. Zum Beispiel:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel wählt alle "sicheren" Attribute des "Slave" -Modells aus und verwenden sie als eigene Attribute. Daher können Sie jedes Attribut verwenden, das im verwandten ActivereCord -Modell im Bereich dieser Klasse als "sicher" gekennzeichnet ist. Zum Beispiel:
<?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 ;Geerbte Attribute können beim Komponieren von Webformularen verwendet werden, die Filterdaten erfassen sollten. Zum Beispiel:
<?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 (); ?>Attributbezeichnungen und Hinweise werden ebenfalls aus dem Modell "Slave" vererbt.
Die Hauptmethode von yii2techarsearchActiveSearchModel ist search() . Es lädt Filterattribute aus dem angegebenen Datenarray, validiert sie und erstellt eine yiidataActiveDataProvider -Instanz, die eigene Attribute als Abfragefilterbedingung anwendet.
ActiveSearchModel verwendet eine ausgefeilte Logik für die Abfragefilterung, die auf den Attributtypen basiert, die von yii2techarsearchActiveSearchModel::$searchAttributeTypes angegeben sind, welcher Wert aus yii2techarsearchActiveSearchModel::$model yii2techarsearchActiveSearchModel::$filterOperators . Standardmäßig wird yiidbQueryInterface::andFilterWhere() für die Filterzusammensetzung verwendet. Für die 'String' -attribute wird es mit dem Bediener von 'Like' verwendet. Für die Methode "Integer" und "Float" ("Double") andFilterCompare() werden sie verwendet, wenn sie verfügbar ist.
Kopf hoch! Missbrauche ActiveSearchModel -Verwendung nicht. Es wurde so konzipiert, dass es nur die einfachsten Fälle abdeckt, wenn die Suchlogik trivial ist. Sie sollten immer ein getrenntes Suchmodell erstellen, es erfordert eine komplexe Logik der Zusammensetzung der Suchabfrage.
Möglicherweise möchten Sie einige Einstellungen des Datenanbieters ändern, die von der search() -Methode erstellt wurden: Paginierung oder Sortiereneinstellungen usw. ändern. Sie können dies über yii2techarsearchActiveSearchModel::$dataProvider tun. Zum Beispiel:
<?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` Sie können yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY -Ereignis verwenden, um die Suchabfrage -Instanz anzupassen, die die Beziehung hinzufügen, die mit eifrigen Lade- oder dauerhaften Bedingungen hinzufügen. Zum Beispiel:
<?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 ]);
}); Sie können auch das Abfragungsobjekt direkt über yii2techarsearchActiveSearchModel::$dataProvider angeben. Zum Beispiel:
<?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 ]);
},
]); Sie können die Operatoren steuern, die für die Abfragefilterung über yii2techarsearchActiveSearchModel::$filterOperators verwendet werden sollen. Es definiert eine Zuordnung zwischen dem Attributtyp und dem Operator, der mit yiidbQueryInterface::andFilterWhere() verwendet werden soll. Jeder Wert kann ein skalarer Bedienerame oder ein PHP -Rückruf sein, der die Abfrageinstanz, den Attributnamen und den Wert annimmt. Zum Beispiel:
<?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 ermöglicht die Filterung für die Attribute mithilfe von andFilterCompare() der Abfrage (z. B.: yiidbQuery::andFilterCompare() ), wodurch die Angabe des Filterwerts in Format: {operator}{value} (z. B. >10 , <=100 und so weiter). Die Liste der Attributnamen, für die die Verwendung eines solchen Vergleichs zulässig ist, wird durch yii2techarsearchActiveSearchModel::$compareAllowedAttributes gesteuert. Zum Beispiel:
<?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.
],
]); Sie können compareAllowedAttributes auf * festlegen, was angibt, dass jedes Float- oder Ganzzahlattribut zum Vergleich zugelassen wird.
HINWEIS:
yii2techarsearchActiveSearchModel::$filterOperatorsNehmen Sie Vorrang voryii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Obwohl die Einrichtung von yii2techarsearchActiveSearchModel::$model ein schnellster Weg ist, um ActiveSearchModel -Instanz zu konfigurieren, ist dies nicht obligatorisch. Sie können es vermeiden, das Modell "Slave" einzustellen und alle suchbezogenen Eigenschaften direkt zu konfigurieren. Zum Beispiel:
<?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 ]);
},
]);