Được rồi, có lẽ một nhà ảo thuật SQL nào đó có thể cung cấp cho bạn một giải pháp SQL tốt hơn. Nhưng cho đến lúc đó ...
Đây là cách tôi thực hiện với Laravel bộ sưu tập (sắp xếp bằng php):
$search_terms = array('York', 'North Yorkshire');
$properties = Property::where(function ($q) use ($search_terms) {
foreach ($search_terms as $value) {
$q->orWhere('address1', 'like', "%{$value}%");
$q->orWhere('address2', 'like', "%{$value}%");
$q->orWhere('postcode', 'like', "%{$value}%");
$q->orWhere('city_town', 'like', "%{$value}%");
$q->orWhere('county', 'like', "%{$value}%");
}
})->paginate(25);
$props = ['address1', 'address2', 'postcode', 'city_town', 'county'];
$properties = $properties->sortByDesc(function($i, $k) use ($search_terms, $props) {
// The bigger the weight, the higher the record
$weight = 0;
// Iterate through search terms
foreach($search_terms as $searchTerm) {
// Iterate through properties (address1, address2...)
foreach($props as $prop) {
// Use strpos instead of %value% (cause php)
if(strpos($i->{$prop}, $searchTerm) !== false)
$weight += 1; // Increase weight if the search term is found
}
}
return $weight;
});
$properties = $properties->values()->all();