Сценарий: я хочу найти Mercedes, но я забыл, как пишется «Mercedes», поэтому я набрал «mer», и в результате в раскрывающемся списке отображается «Nissan Almera» сверху, потому что «Almera» содержит «mer» и идентификатор "Nissan Almera" меньше, чем "Mercedes", тогда мне приходится прокручивать, пока только в самом низу не будет виден результат "Mercedes".
public function getCarModel(Request $request) {
$term = $request->term;
$arr = explode(' ', $term);
$results_collect = [];
foreach($arr as $key => $str) {
$model_results = car_models::with('brand')
->whereHas('brand', function($q) use($str){
$q->where('brand', 'LIKE', '%'.$str.'%');
})
->orWhere('year', 'LIKE', '%'.$str.'%')
->orWhere('model', 'LIKE', '%'.$str.'%')
->orWhere('spec', 'LIKE', '%'.$str.'%')
->orWhere('engine', 'LIKE', '%'.$str.'%')
->pluck('id');
$results_collect[$key] = $model_results->toArray();
}
$results_intersect = collect($results_collect[0]);
foreach ($results_collect as $collect) {
$results_intersect = $results_intersect->intersect($collect);
}
$models = car_models::with('brand')->whereIn('id', $results_intersect)->take(100)->get();
$auto_complete_results = [];
foreach ($models as $key => $model) {
$auto_complete_results[$key] = (object) [
'value' => $model->id,
'label' => $model->year.' '.$model->brand->brand.' '.$model->model .' '.$model->spec.' '.$model->engine,
];
}
return response()->json($auto_complete_results);
}
Так выглядит база данных
id | brand_id | модель | спец | двигатель | год
1, 6, Almera, VL, 1,5, 2017
2, 6, Almera, E, 1,5, 2014
3, 13, A, 180 Urban Line (CBU), 1,6, 2017
brand_id 6 = Nissan
brand_id 13 = Mercedes-Benz
Если пользователь вводит «mer», эта функция всегда возвращает 3 записи и сортируется по id, который равен (1,2,3). Результат, который я ожидаю, равен (3,1,2), потому что я хочу, чтобы результаты сначала показывали результат бренда, а затем только модель, спецификацию, двигатель и год.