Как получить коллекцию с предварительным заказом? - PullRequest
0 голосов
/ 03 апреля 2019

Сценарий: я хочу найти 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), потому что я хочу, чтобы результаты сначала показывали результат бренда, а затем только модель, спецификацию, двигатель и год.

1 Ответ

0 голосов
/ 03 апреля 2019

В поиске бренда замените код следующим: $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);
    }

Надеюсь, это поможет вам.

...