Ekstensi ini menyediakan model pencarian terpadu untuk YII Activerecord.
Untuk informasi lisensi, periksa file lisensi.
Cara yang disukai untuk menginstal ekstensi ini adalah melalui komposer.
Baik lari
php composer.phar require --prefer-dist yii2tech/ar-search
atau tambahkan
"yii2tech/ar-search" : " * "ke bagian yang diperlukan dari komposer Anda.
Ekstensi ini menyediakan model pencarian terpadu untuk Yii Activerecord melalui kelas model khusus - yii2techarsearchActiveSearchModel .
Model ini mampu mengambil atributnya, aturan validasi, dan memfilter logika dari model Activerecord sumber 'budak' yang ditentukan melalui yii2techarsearchActiveSearchModel::$model . Dengan demikian, Anda tidak perlu mendeklarasikan kelas model yang terpisah untuk mencari dan mendefinisikan logika filter. Misalnya:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel memilih semua atribut 'aman' dari model 'budak' dan menggunakannya sebagai atribut sendiri. Dengan demikian Anda dapat menggunakan atribut apa pun, yang ditandai sebagai 'aman' dalam model Activerecord terkait dalam ruang lingkup kelas ini. Misalnya:
<?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 ;Atribut yang diwariskan dapat digunakan saat menyusun formulir web, yang harus mengumpulkan data filter. Misalnya:
<?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 (); ?>Label atribut dan petunjuk juga diwarisi dari model 'budak'.
Metode utama yii2techarsearchActiveSearchModel adalah search() . Ini memuat atribut filter dari array data yang diberikan, memvalidasi mereka dan membuat instance yiidataActiveDataProvider menerapkan atribut sendiri sebagai kondisi filter kueri.
ActiveSearchModel menggunakan logika canggih untuk pemfilteran kueri, berdasarkan jenis atribut, yang ditentukan oleh yii2techarsearchActiveSearchModel::$searchAttributeTypes , Nilai yang diekstraksi dari yii2techarsearchActiveSearchModel::$model yii yii2techarsearchActiveSearchModel::$filterOperators . Secara default yiidbQueryInterface::andFilterWhere() akan digunakan untuk komposisi filter. Untuk atribut 'string' yang akan digunakan dengan operator 'seperti'. Untuk metode 'integer' dan 'float' ('double') andFilterCompare() akan digunakan, jika tersedia.
Kepala! Jangan menyalahgunakan penggunaan ActiveSearchModel . Ini telah dirancang untuk hanya mencakup kasus paling sederhana, ketika logika pencarian sepele. Anda harus selalu membuat model pencarian yang terpisah, itu membutuhkan logika komposisi yang kompleks dari kueri pencarian.
Anda mungkin ingin mengubah beberapa pengaturan penyedia data, dibuat dengan metode search() : Ubah pagination atau sortir pengaturan dan sebagainya. Anda dapat melakukan ini melalui yii2techarsearchActiveSearchModel::$dataProvider . Misalnya:
<?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` Anda dapat menggunakan yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY acara untuk menyesuaikan contoh kueri pencarian menambahkan relasi pemuatan yang bersemangat atau kondisi permanen. Misalnya:
<?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 ]);
}); Anda juga dapat menentukan objek kueri secara langsung melalui yii2techarsearchActiveSearchModel::$dataProvider . Misalnya:
<?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 ]);
},
]); Anda dapat mengontrol operator untuk digunakan untuk pemfilteran kueri melalui yii2techarsearchActiveSearchModel::$filterOperators . Ini mendefinisikan pemetaan antara jenis atribut dan operator yang akan digunakan dengan yiidbQueryInterface::andFilterWhere() . Setiap nilai dapat berupa nama operator skalar atau panggilan balik PHP, menerima contoh kueri, nama dan nilai atribut. Misalnya:
<?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 memungkinkan pemfilteran untuk atribut menggunakan metode andFilterCompare() dari kueri (misalnya: yiidbQuery::andFilterCompare() ), yang memungkinkan penentu nilai filter dalam format: {operator}{value} (misalnya: >10 , <=100 dan Seharusnya). Daftar nama atribut, yang penggunaan perbandingan tersebut diizinkan dikendalikan oleh yii2techarsearchActiveSearchModel::$compareAllowedAttributes . Misalnya:
<?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.
],
]); Anda dapat mengatur compareAllowedAttributes ke * , yang menunjukkan atribut float atau integer akan diizinkan untuk perbandingan.
Catatan:
yii2techarsearchActiveSearchModel::$filterOperatorsdiutamakan lebih dariyii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Meskipun dalam kebanyakan kasus pengaturan yii2techarsearchActiveSearchModel::$model adalah cara tercepat untuk mengonfigurasi instance ActiveSearchModel , itu tidak wajib. Anda dapat menghindari pengaturan model 'slave' dan mengkonfigurasi semua properti terkait pencarian secara langsung. Misalnya:
<?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 ]);
},
]);