Автозаполнение поиска в Laravel 5.5 с помощью Typeahead.js с использованием двух столбцов таблицы

У меня есть база данных, выглядящая так:

-------------------------------------
| id | FirstName | LastName | Email |
-------------------------------------
|  1 |    Test   | Customer | null  |
|  2 |    Some   |   Name   | null  |
-------------------------------------

Теперь я хочу получить идентификатор клиента, сопоставив имя и фамилию... если они найдены в строке, тогда получите идентификатор.

Я использую Laravel 5.5.28 и попробовал Typeahead.js, чтобы добиться того, чего я изначально хотел, но по какой-то причине я могу заставить его работать только с одним столбцом либо с именем, либо с фамилией.

Это рабочий код (только для FirstName):

CDN

  <script src = "{{ asset('js/vendor/jquery.min.js') }}"></script>
  <script src = "{{ asset('js/vendor/popper.min.js') }}"></script>
  <script src = "{{ asset('js/vendor/bootstrap.min.js') }}"></script>
  <script src = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.1/bootstrap3-typeahead.min.js"></script>

SearchController.php

public function autocomplete(Request $request)
    {
        $datas = Customers::select("FirstName")
                 ->where("FirstName", "LIKE","%{$request->input('query')}%")
                 ->get();

        $dataModified = array();
        foreach ($datas as $data)
        {
            $dataModified[] = $data->FirstName;
        }

        return response()->json($dataModified);
    }
}

Получение идентификатора в «JobsController.php»

public function store(Request $request)
    {
        $job =  new Jobs;
        $job->cust_id = Customers::where('FirstName', $request->input('customer_name'))->value('id');

        dump($job->cust_id);
    }

Это вид:

{!! Form::open(['action' => 'JobsController@store', 'method' => 'POST']) !!}

{{Form::text('customer_name', '', ['class' => 'form-control typeahead', 'placeholder' => 'Type in customer name...'])}}
{{Form::submit('Create Job', ['class' => 'btn btn-primary mt-2'])}}

{!! Form::close() !!}

Маршруты

Route::get('jobs.create', 'SearchController@index')->name('search');
Route::get('autocomplete', 'SearchController@autocomplete')->name('autocomplete');

jQuery

<script type = "text/javascript">
     var path = "{{ route('autocomplete') }}";
       $('input.typeahead').typeahead({
         source: function(query, process) {
         return $.get(path, { query: query }, function(data) {
         return process(data);
        });
           }
            });
</script>

Теперь это работает просто отлично, но только для FirstName. Я хочу, чтобы это работало для полного имени (Имя + Фамилия)

Мне удалось заставить его работать как с именем, так и с фамилией, но только на «внешнем интерфейсе»... он не получает идентификатор из базы данных.

Вот что я сделал, чтобы в предложениях автозаполнения (при начале ввода) были и Имя, и Фамилия:

SearchController.php

public function autocomplete(Request $request)
    {
        $datas = Customers::select("FirstName", "LastName")
                 ->where("FirstName", "LIKE","%{$request->input('query')}%")
                 ->get();

        $dataModified = array();
        foreach ($datas as $data)
        {
            $dataModified[] = $data->FirstName .' '. $data->LastName;
        }

        return response()->json($dataModified);
    }

Он показывает как имя, так и фамилию при вводе, но возвращает нулевой идентификатор.

Я хотел бы иметь возможность использовать столбцы FirstName и LastName в своем запросе, поэтому я могу получить идентификатор только тогда, когда FirstName и LastName совпадают.

С нетерпением жду ваших мыслей.

Спасибо за ваше время. Действительно ценю это.

Обновление №1


Тем временем я изменил запрос в SearchController, поэтому я думаю, что код здесь теперь в порядке:

$datas = Customers::select("FirstName", "LastName")
                    ->where(function($q) use($request) {
                        $q->where("FirstName", "LIKE","%{$request->input('query')}%")
                          ->orWhere("LastName", "LIKE","%{$request->input('query')}%");
                    })->get();

Единственная проблема в том, что я все еще получаю «нулевой» идентификатор.

Может быть потому, что я пытаюсь получить идентификатор?

В Джобсконтроллер у меня есть такой метод "сохранения":

public function store(Request $request)
    {
        $job =  new Jobs;
        $job->cust_id = Customers::where('FirstName', $request->input('customer_name'))
                                    ->orWhere('LastName', $request->input('customer_name'))
                                    ->value('id');

    }

Это правильный способ получить идентификатор?

Обновление №2


Я был обеспокоен тем, что $request->input не возвращает правильный формат, поэтому я получаю «нулевой» идентификатор в своем запросе, но я ошибался, потому что простой dump(); показывает, что $request->input возвращает ожидаемую строку.

У меня действительно закончились идеи. Возможно, мне следует использовать другой способ получить идентификатор? Как использовать идентификатор в URL-адресе?

Любые мысли и советы очень ценятся. Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 093
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использую приведенный ниже код, работающий нормально

Моя функция контроллера

public function Search(Request $request)
{
    $data = Account::Join('groups','groups.group_id','=','accounts.group_id')->select("accounts.name","accounts.account_id","groups.group_name")
            ->where("name","LIKE","%".Input::get('query')."%")
            ->get()->toArray();

    return response()->json($data);
}

мой твиттер

var data = new Bloodhound({
          datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
          queryTokenizer: Bloodhound.tokenizers.whitespace,
          prefetch: "{{route('accounts/search')}}",
          remote: {
            url: "{{url('accounts/search')}}?query=%query",
            transform: function(list) {
                    return $.map(list, function(k,v) { return { id: k.account_id, name: k.name,group:k.group_name }; });
                },
            wildcard: '%query'
          }
        });

        $('.typeahead').typeahead(null, {
            hint: true,
            limit:100,
            highlight: true,
            minLength: 1,
            name: 'Accounts',
            displayKey: function(k) {
               return k.name + " - ("+k.group+")";
            },
              source: data,
              templates: {
                empty: [
                  '<div class = "empty-message">',
                    '<span><strong>Account Not Found</strong></span><br/>',
                    '<button type = "button" class = "btn btn-info" id = "account_modal">+ Add New Account</button>',
                  '</div>'
                ].join('\n'),
              }
        }).on('typeahead:selected', function (e, suggestion, name) {
            $(this).parent().next().val(suggestion.id);
            $(this).parent().next().next().remove();
        });

Вы используете другую структуру запроса. Я думаю, что мой более простой, чем ваш, но по какой-то причине все еще не работает...

Marian Pop 13.04.2019 17:13
Ответ принят как подходящий

Итак, я, наконец, разобрался с этим. Мне пришлось CONCAT «FirstName» и «LastName», чтобы получить идентификатор, потому что без CONCAT мой код сравнивал ввод $request-> с обоими столбцами (FirstName, LastName) и никогда не совпадал.

Рабочий запрос в JobsController:

$field = DB::raw("CONCAT(`FirstName`, ' ', `LastName`)");
$query = $request->input('custName');

$job =  new Jobs;
$job->cust_id = Customers::where($field, "LIKE", "%{$query}%")->value('id');

Спасибо всем за ваше время. Действительно ценится.

Другие вопросы по теме