【发布时间】:2019-04-03 12:13:40
【问题描述】:
场景:我想搜索 Mercedes,但我忘记如何拼写“Mercedes”,所以我输入了“mer”,下拉结果在顶部显示“Nissan Almera”,因为“Almera”包含“mer”并且“Nissan Almera”的id小于“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);
}
这就是数据库的样子
标识 |品牌标识 |型号 |规格 |发动机 |年份
1, 6, 阿尔梅拉, VL, 1.5, 2017
2, 6, 阿尔梅拉, E, 1.5, 2014
3, 13, A, 180 Urban Line (CBU), 1.6, 2017
brand_id 6 = 日产
brand_id 13 = 梅赛德斯-奔驰
如果用户键入“mer”,此函数将始终返回 3 条记录并按 id 排序,即 (1,2,3)。我期望的输出是 (3,1,2),因为我希望输出首先显示品牌结果,然后仅显示型号、规格、引擎和年份。
【问题讨论】:
-
->orWhere('model', 'LIKE', $str.'%')只要你知道你用的是前几个字母 -
听起来不难,按照重要性顺序做多个orderBys。
标签: php laravel sql-order-by