ส่วนขยายนี้มีรูปแบบการค้นหาแบบครบวงจรสำหรับ yii activerecord
สำหรับข้อมูลใบอนุญาตตรวจสอบไฟล์ใบอนุญาต
วิธีที่ต้องการในการติดตั้งส่วนขยายนี้คือผ่านนักแต่งเพลง
วิ่งอย่างใดอย่างหนึ่ง
php composer.phar require --prefer-dist yii2tech/ar-search
หรือเพิ่ม
"yii2tech/ar-search" : " * "ไปยังส่วนที่ต้องการของนักแต่งเพลงของคุณ json
ส่วนขยายนี้มีรูปแบบการค้นหาแบบครบวงจรสำหรับ yii activerecord ผ่านคลาสโมเดลพิเศษ - yii2techarsearchActiveSearchModel
โมเดลนี้สามารถดึงคุณลักษณะกฎการตรวจสอบความถูกต้องและตรรกะการกรองจากโมเดล 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 ;คุณลักษณะที่สืบทอดมาอาจใช้ในขณะที่เขียนแบบฟอร์มเว็บซึ่งควรรวบรวมข้อมูลตัวกรอง ตัวอย่างเช่น:
<?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 ใช้ตรรกะที่ซับซ้อนสำหรับการกรองแบบสอบถามตามประเภทแอตทริบิวต์ที่ระบุโดย yii2techarsearchActiveSearchModel::$searchAttributeTypes ซึ่งมีค่าที่แยกออกมาจาก yii2techarsearchActiveSearchModel::$model 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() วิธีการค้นหา (ตัวอย่างเช่น: yii >10 yiidbQuery::andFilterCompare() ) ซึ่งอนุญาตให้ระบุค่าตัวกรองใน <=100 แบบ: {operator}{value} รายการชื่อแอตทริบิวต์ซึ่งอนุญาตให้ใช้การเปรียบเทียบดังกล่าวได้รับการควบคุมโดย 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 ]);
},
]);