Я думаю создать запрос, в котором вы проверяете оба лайка, а затем выбираете псевдостолбец в результате того, что первый «лайк» совпадает, если «ложь», вы можете предположить, что второй совпадает. Затем просто упорядочите по псевдостолбцу.
В сыром MySQL я думаю, что это будет:
SELECT ID, Name, Address, Phone, Latitude, Longitude,
IF(name = '$q',2,IF(name LIKE '$q%',1,0)) as `MatchStrength`
FROM facility
WHERE name like '%$q%' AND name != ''
ORDER BY MatchStrength DESC LIMIT 10
Вы также можете сделать это без дополнительного столбца:
SELECT ID, Name, Address, Phone, Latitude, Longitude
FROM facility
WHERE name like '%$q%' AND name != ''
ORDER BY IF(name = '$q',2,IF(name LIKE '$q%',1,0)) DESC LIMIT 10
Преобразование этого в логику ORM является еще одной проблемой. Можно попробовать запустить как сырой SQL с DB::select
Это некрасиво и, вероятно, уязвимо для SQL-инъекций, но сделайте это, чтобы узнать, не приведет ли оно вас куда-либо:
$facility = DB::table('facility')
->select('ID', 'Name', 'Address', 'Phone', 'Latitude', 'Longitude')
->where('Name', 'like', "%{$q}%")
->where('Name', '!=', '')
->orderByRaw("IF(name = '{$q}',2,IF(name LIKE '{$q}%',1,0)) DESC")
->limit(10)
->get();
Возможно, можно переключиться на подготовленные запросы, выполнив конкатенацию в MySQL, используя CONCAT