แพ็คเกจ Laravel นี้ช่วยให้คุณค้นหาผ่าน Eloquent model ได้หลายแบบ รองรับการเรียงลำดับ การแบ่งหน้า การสืบค้นที่กำหนดขอบเขต ความสัมพันธ์ในการโหลดที่กระตือรือร้น และการค้นหาผ่านคอลัมน์เดียวหรือหลายคอลัมน์
❤️ เราภูมิใจสนับสนุนชุมชนด้วยการพัฒนาแพ็คเกจ Laravel และแจกฟรี หากแพ็คเกจนี้ช่วยคุณประหยัดเวลาหรือหากคุณต้องพึ่งพามันอย่างมืออาชีพ โปรดพิจารณาสนับสนุนการบำรุงรักษาและการพัฒนา และดูแพ็คเกจพรีเมียมล่าสุดของเรา: Inertia Table การติดตามปัญหาและการดึงคำขอต้องใช้เวลา แต่เรายินดีที่จะช่วยเหลือ!
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับความเป็นมาของแพ็คเกจนี้ โปรดอ่านโพสต์ในบล็อก
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
composer require protonemedia/laravel-cross-eloquent-search
get
ได้รับการเปลี่ยนชื่อเพื่อ search
addWhen
ได้ถูกลบออกไปแล้ว when
.updated_at
ในกรณีส่วนใหญ่ หากคุณไม่ใช้การประทับเวลา ตอนนี้ระบบจะใช้คีย์หลักตามค่าเริ่มต้น startWithWildcard
ได้รับการเปลี่ยนชื่อเป็น beginWithWildcard
getUpdatedAtColumn
ก่อนหน้านี้มันเป็นการฮาร์ดโค้ดเป็น updated_at
คุณยังคงใช้คอลัมน์อื่นเพื่อเรียงลำดับได้allowEmptySearchQuery
และคลาส EmptySearchQueryException
ได้ถูกลบออกไปแล้ว แต่คุณยังสามารถรับผลลัพธ์ได้โดยไม่ต้องค้นหา เริ่มคำค้นหาของคุณโดยการเพิ่มแบบจำลองอย่างน้อยหนึ่งรายการเพื่อค้นหา เรียกเมธอด add
ด้วยชื่อคลาสของโมเดลและคอลัมน์ที่คุณต้องการค้นหา จากนั้นเรียกวิธี search
ด้วยคำค้นหา และคุณจะได้รับอินสแตนซ์ IlluminateDatabaseEloquentCollection
พร้อมผลลัพธ์
ผลลัพธ์จะถูกจัดเรียงจากน้อยไปหามากตามคอลัมน์ ที่อัปเดต ตามค่าเริ่มต้น ในกรณีส่วนใหญ่ คอลัมน์นี้จะได้ updated_at
_at หากคุณได้ปรับแต่งค่าคงที่ UPDATED_AT
ของโมเดลของคุณ หรือเขียนทับเมธอด getUpdatedAtColumn
แพ็คเกจนี้จะใช้คอลัมน์ที่กำหนดเอง หากคุณไม่ได้ใช้การประทับเวลาเลย ระบบจะใช้คีย์หลักตามค่าเริ่มต้น แน่นอนคุณสามารถสั่งซื้อโดยคอลัมน์อื่นได้เช่นกัน
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
หากคุณสนใจเรื่องการเยื้อง คุณสามารถเลือกใช้วิธีการ new
บนด้านหน้าอาคารได้:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
นอกจากนี้ยังมีวิธี when
ที่จะใช้บางประโยคตามเงื่อนไขอื่น:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
ตามค่าเริ่มต้น เราจะแยกข้อความค้นหาออก และคำหลักแต่ละคำจะได้รับสัญลักษณ์ตัวแทนเพื่อทำการจับคู่บางส่วน ในทางปฏิบัติหมายความว่าคำค้นหา apple ios
จะส่งผลให้เป็น apple%
และ ios%
หากคุณต้องการให้สัญลักษณ์ wildcard ขึ้นต้นด้วย คุณสามารถเรียกใช้เมธอด beginWithWildcard
ซึ่งจะส่งผลให้เป็น %apple%
และ %ios%
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
หมายเหตุ: ในเวอร์ชันก่อนหน้าของแพ็คเกจนี้ วิธีการนี้เรียกว่า startWithWildcard()
หากคุณต้องการปิดการใช้งานลักษณะการทำงานที่มีไวด์การ์ดต่อท้ายข้อกำหนด คุณควรเรียกเมธอด endWithWildcard
ด้วย false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
รองรับการค้นหาหลายคำตั้งแต่แรกเริ่ม เพียงใส่วลีของคุณให้เป็นเครื่องหมายคำพูดคู่
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
คุณสามารถปิดการใช้งานการแยกวิเคราะห์คำค้นหาได้โดยการเรียกเมธอด dontParseTerm
ซึ่งให้ผลลัพธ์เหมือนกับการใช้เครื่องหมายคำพูดคู่
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
หากคุณต้องการจัดเรียงผลลัพธ์ตามคอลัมน์อื่น คุณสามารถส่งคอลัมน์นั้นไปยังวิธี add
เป็นพารามิเตอร์ที่สามได้ เรียกใช้เมธอด orderByDesc
เพื่อเรียงลำดับผลลัพธ์จากมากไปน้อย
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
คุณสามารถเรียกใช้เมธอด orderByRelevance
เพื่อเรียงลำดับผลลัพธ์ตามจำนวนครั้งของคำค้นหา ลองนึกภาพสองประโยคนี้:
หากคุณค้นหา Apple iPad ประโยคที่สองจะปรากฏขึ้นก่อน เนื่องจากมีคำค้นหาที่ตรงกันมากกว่า
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
ไม่ รองรับการเรียงลำดับตามความเกี่ยวข้อง หากคุณกำลังค้นหาผ่านความสัมพันธ์ (ซ้อนกัน)
หากต้องการจัดเรียงผลลัพธ์ตามประเภทโมเดล คุณสามารถใช้เมธอด orderByModel
โดยให้ลำดับโมเดลที่คุณต้องการ:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
เราขอแนะนำอย่างยิ่งให้แบ่งหน้าผลลัพธ์ของคุณ เรียกวิธี paginate
ก่อนวิธี search
และคุณจะได้รับอินสแตนซ์ของ IlluminateContractsPaginationLengthAwarePaginator
เป็นผลลัพธ์ วิธี paginate
ใช้พารามิเตอร์สามตัว (เป็นทางเลือก) เพื่อปรับแต่งตัวแบ่งหน้า อาร์กิวเมนต์เหล่านี้เหมือนกับตัวแบ่งหน้าฐานข้อมูลของ Laravel
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
คุณอาจใช้การแบ่งหน้าแบบธรรมดา สิ่งนี้จะส่งคืนอินสแตนซ์ของ IlluminateContractsPaginationPaginator
ซึ่งไม่ทราบความยาว:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
แทนที่จะส่งชื่อคลาส คุณสามารถส่งอินสแตนซ์ของตัวสร้างคิวรี Eloquent ไปยังเมธอด add
ซึ่งจะทำให้คุณสามารถเพิ่มข้อจำกัดให้กับแต่ละโมเดลได้
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
คุณสามารถค้นหาได้หลายคอลัมน์โดยส่งอาร์เรย์ของคอลัมน์เป็นอาร์กิวเมนต์ที่สอง
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
คุณสามารถค้นหาความสัมพันธ์ (แบบซ้อน) ได้โดยใช้เครื่องหมาย จุด :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
คุณสามารถใช้การค้นหาข้อความแบบเต็มของ MySQL ได้โดยใช้วิธี addFullText
คุณสามารถค้นหาในคอลัมน์เดียวหรือหลายคอลัมน์ (โดยใช้ดัชนีข้อความแบบเต็ม) และคุณสามารถระบุชุดของตัวเลือกได้ เช่น เพื่อระบุโหมด คุณยังสามารถผสมผสานการค้นหาแบบปกติและแบบเต็มในข้อความค้นหาเดียว:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
หากคุณต้องการค้นหาความสัมพันธ์ คุณจะต้องส่งผ่านอาร์เรย์โดยที่คีย์อาร์เรย์มีความสัมพันธ์ ในขณะที่ค่าเป็นอาร์เรย์ของคอลัมน์:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL มีอัลกอริธึม soundex ในตัว ดังนั้นคุณจึงสามารถค้นหาคำที่ฟังดูเกือบจะเหมือนกันได้ คุณสามารถใช้คุณสมบัตินี้ได้โดยการเรียกเมธอด soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
ไม่มีอะไรจะอธิบายมากนักที่นี่ แต่รองรับเช่นกัน :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
คุณเรียกวิธี search
โดยไม่มีคำหรือคำว่างเปล่า ในกรณีนี้ คุณสามารถละทิ้งอาร์กิวเมนต์ที่สองของวิธี add
ด้วยเมธอด orderBy
คุณสามารถตั้งค่าคอลัมน์ให้เรียงลำดับตาม (ก่อนหน้าอาร์กิวเมนต์ที่สาม):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
คุณสามารถนับจำนวนผลลัพธ์ด้วยวิธี count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
คุณสามารถใช้ includeModelType
เพื่อเพิ่มประเภทโมเดลให้กับผลการค้นหา
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
ตามค่าเริ่มต้น จะใช้คีย์ type
แต่คุณสามารถปรับแต่งสิ่งนี้ได้โดยส่งคีย์ไปยังเมธอด
คุณยังสามารถปรับแต่งค่า type
ได้โดยการเพิ่มเมธอดสาธารณะ searchType()
ให้กับโมเดลของคุณเพื่อแทนที่ชื่อฐานคลาสเริ่มต้น
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
คุณสามารถใช้ parser ด้วยวิธี parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
คุณยังสามารถส่งผ่านการโทรกลับเป็นอาร์กิวเมนต์ที่สองเพื่อวนซ้ำแต่ละเทอมได้:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
Inertia Table
: ตารางขั้นสูงสุดสำหรับ Inertia.js พร้อมตัวสร้างแบบสอบถามในตัวLaravel Blade On Demand
: แพ็คเกจ Laravel เพื่อรวบรวมเทมเพลต Blade ในหน่วยความจำLaravel Eloquent Scope as Select
: หยุดการทำซ้ำขอบเขตการสืบค้น Eloquent และข้อ จำกัด ของคุณใน PHP แพ็คเกจนี้ช่วยให้คุณนำขอบเขตและข้อจำกัดการสืบค้นของคุณกลับมาใช้ใหม่ได้โดยการเพิ่มเป็นแบบสอบถามย่อยLaravel FFMpeg
: แพ็คเกจนี้ให้การทำงานร่วมกับ FFmpeg สำหรับ Laravel การจัดเก็บไฟล์ได้รับการจัดการโดยระบบไฟล์ของ LaravelLaravel MinIO Testing Tools
: รันการทดสอบของคุณกับเซิร์ฟเวอร์ MiniIO S3Laravel Mixins
: คอลเลกชันสารพัด LaravelLaravel Paddle
: การรวม Paddle.com API สำหรับ Laravel พร้อมรองรับ webhooks/กิจกรรมLaravel Task Runner
: เขียนสคริปต์เชลล์เช่น Blade Components และเรียกใช้ในเครื่องหรือบนเซิร์ฟเวอร์ระยะไกลLaravel Verify New Email
: แพ็คเกจนี้เพิ่มการรองรับสำหรับการตรวจสอบที่อยู่อีเมลใหม่: เมื่อผู้ใช้อัปเดตที่อยู่อีเมลของตน มันจะไม่แทนที่ที่อยู่อีเมลเก่าจนกว่าที่อยู่อีเมลใหม่จะได้รับการตรวจสอบLaravel XSS Protection
: Laravel Middleware เพื่อปกป้องแอปของคุณจากการเขียนสคริปต์ข้ามไซต์ (XSS) มันฆ่าเชื้ออินพุตคำขอและสามารถฆ่าเชื้อคำสั่ง Blade echo ได้หากคุณพบปัญหาที่เกี่ยวข้องกับความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม
แพคเกจนี้เป็น Treeware หากคุณใช้มันในการผลิต เราขอให้คุณ ซื้อต้นไม้ให้โลก เพื่อขอบคุณสำหรับงานของเรา การมีส่วนร่วมกับป่า Treeware คุณจะสร้างงานให้กับครอบครัวในท้องถิ่นและฟื้นฟูแหล่งที่อยู่อาศัยของสัตว์ป่า