แพ็คเกจนี้ทำให้ง่ายต่อการรับการค้นหาที่มีโครงสร้างจากแหล่งต่างๆ นี่คือตัวอย่างที่เราค้นหาผ่านบางรุ่น เราได้เตรียมโมเดลเล็กๆ น้อยๆ ไว้แล้ว
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
การค้นหาจะดำเนินการโดยคำนึงถึงขนาดตัวพิมพ์ ขณะนี้ $searchResults
มีโมเดล User
ทั้งหมดที่มี john
อยู่ในแอตทริบิวต์ name
และ BlogPost
ที่มี 'john' อยู่ในแอตทริบิวต์ title
ในมุมมองของคุณ คุณสามารถวนซ้ำผลการค้นหาได้แล้ว:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
ในตัวอย่างนี้ เราใช้โมเดล แต่คุณสามารถเพิ่มลักษณะการค้นหาสำหรับ API ภายนอก รายการไฟล์ หรืออาร์เรย์ของค่าได้อย่างง่ายดาย
เราลงทุนทรัพยากรจำนวนมากเพื่อสร้างแพ็คเกจโอเพ่นซอร์สที่ดีที่สุดในระดับเดียวกัน คุณสามารถสนับสนุนเราได้โดยการซื้อหนึ่งในผลิตภัณฑ์ที่ต้องชำระเงินของเรา
เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณถึงเรา โดยระบุว่าคุณใช้แพ็คเกจใดของเรา คุณจะพบที่อยู่ของเราในหน้าติดต่อของเรา เราเผยแพร่โปสการ์ดที่ได้รับทั้งหมดบนวอลล์โปสการ์ดเสมือนของเรา
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
composer require spatie/laravel-searchable
ในการค้นหาโมเดลต่างๆ คุณจะต้องให้พวกเขาใช้อินเทอร์เฟซ Searchable
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
คุณจะต้องเพิ่มเมธอด getSearchResult
ให้กับโมเดลที่ค้นหาได้แต่ละโมเดลซึ่งจะต้องส่งคืนอินสแตนซ์ของ SearchResult
ต่อไปนี้คือลักษณะของโมเดลโพสต์บล็อก
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
ด้วยโมเดลที่เตรียมไว้ คุณสามารถค้นหาได้ดังนี้:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
การค้นหาจะดำเนินการโดยคำนึงถึงขนาดตัวพิมพ์ ขณะนี้ $searchResults
มีโมเดล User
ทั้งหมดที่มี john
อยู่ในแอตทริบิวต์ name
คุณยังสามารถส่งแอตทริบิวต์หลายรายการเพื่อค้นหาผ่าน:
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
เพื่อให้ได้การควบคุมที่ละเอียด คุณสามารถใช้ callable ได้ ด้วยวิธีนี้ คุณยังสามารถค้นหารายการที่ตรงกันทุกประการ ใช้ขอบเขต ความสัมพันธ์ในการโหลดที่ต้องการ หรือแม้แต่กรองการสืบค้นของคุณเหมือนกับที่คุณใช้ตัวสร้างการสืบค้น
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
คุณไม่ได้จำกัดอยู่เพียงการลงทะเบียนโมเดลพื้นฐานเป็นลักษณะการค้นหาเท่านั้น คุณสามารถสร้างลักษณะการค้นหาที่กำหนดเองของคุณเองได้อย่างง่ายดายโดยขยายคลาส SearchAspect
พิจารณาแง่มุมการค้นหาที่กำหนดเองต่อไปนี้เพื่อค้นหา API ภายนอก:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
นี่คือวิธีที่คุณสามารถใช้:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
คุณสามารถจำกัดจำนวนผลลัพธ์ที่ส่งคืนในแต่ละแง่มุมได้โดยการเรียก limitAspectResults
ก่อนที่จะดำเนินการค้นหา
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
ต่อไปนี้เป็นตัวอย่างในการแสดงผลการค้นหา:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
คุณสามารถปรับแต่ง $type
ได้โดยเพิ่มคุณสมบัติสาธารณะ $searchableType
บนโมเดลของคุณหรือด้านการค้นหาที่กำหนดเอง
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม