【问题标题】:How to retrieve a collection with advanced orderBy?如何使用高级 orderBy 检索集合?
【发布时间】: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


【解决方案1】:

品牌搜索中,请将代码替换为$q->where('brand', 'LIKE', $str.'%'); 因为您希望您的搜索键应该返回结果,该结果将在响应的开头,而不是全部在响应中。

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);
    }

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多