Как создать конечную точку API в Laravel, которую можно использовать для поиска в любой таблице, которую мы хотим?

#laravel #eloquent #laravel-controller #laravel-api

Вопрос:

Фон

Давайте рассмотрим гипотетический сценарий. Предположим, у нас есть пять разных таблиц в нашей базе данных,

  1. Клиенты
  2. Категории
  3. Продукты
  4. Заказы
  5. OderDetails

Наш клиент хочет, чтобы мы добавили панель поиска во внешний интерфейс, где пользователь может искать определенный продукт, и при нажатии кнопки поиска на интерфейсе должны отображаться соответствующие продукты.

Мой подход к решению этой проблемы

Чтобы добавить вышеупомянутую функциональность, я наткнулся на следующую стратегию.
👉 Я бы добавил поле ввода для ввода названия продукта и кнопку отправки.
👉 После нажатия кнопки «Отправить» запрос на получение будет отправлен в серверную часть. В параметрах запроса будет включено название продукта, введенное пользователем
👉 Как только запрос GET будет получен в серверную часть, я передам его в ProductsController, и в рамках метода, определенного в ProductController, я буду использовать модель продукта для запроса таблицы products, чтобы узнать, есть ли какие-либо совпадающие результаты.
👉 Если есть какие-либо совпадающие результаты, я отправлю их на интерфейс внутри объекта JSON, а если нет никаких совпадающих результатов, я установлю флаг успеха false внутри объекта JSON и отправлю его на интерфейс
👉 Во внешнем интерфейсе, если есть какие-либо совпадающие результаты, я отобразю их на экране. В противном случае я выведу сообщение «Результаты не найдены!».

Проблема с моим подходом

Все работает нормально, если мы хотим выполнить поиск только в таблице продуктов. Но что, если позже наш клиент скажет нам что-то вроде: «Помните ту функцию поиска, которую вы добавили для продуктов? Я подумал, что функциональность также должна быть добавлена в заказы. Я думаю, что по мере того, как список заказов пользователя растет и растет, они также должны иметь возможность искать свои предыдущие заказы».

👉 Теперь, поскольку в нашем предыдущем подходе к поиску продуктов был реализован в ProductController с использованием модели продукта, когда мы добавляем ту же функциональность в Заказы, НАМ ПРИДЕТСЯ ДЕЛАТЬ ТО ЖЕ САМОЕ, ЧТО МЫ ДЕЛАЛИ В ProductsController СНОВА ВНУТРИ OrdersController, ИСПОЛЬЗУЯ модель заказа. Не требуется нескольких секунд, чтобы понять, что это приводит к дублированию кода.

Краткое описание проблемы

Как мы добавляем конечную точку API в laravel для функции поиска, которую можно использовать для поиска в любой таблице нашей базы данных и получения результатов, вместо того, чтобы функция поиска ограничивалась конкретным контроллером и соответствующей моделью?

Комментарии:

1. Добро пожаловать в SO, здесь мы поможем вам с вашим кодом. Мы не учим вас, как что-то строить.

2. не могли бы вы показать, что вы сделали до сих пор

3. Вы просите логики! посмотрите на запросы к базе данных, особенно «объединение» для поиска в нескольких таблицах реляционной базы данных

4. Возможно, вам захочется взглянуть на прицелы . Их можно использовать для фильтрации моделей. Например, в текстовых полях модели можно выполнить поиск с помощью строки запроса. Теперь вам нужно только просмотреть все модели, с которыми вы хотите выполнить поиск, и предоставить красноречивость остальным.

5. Пожалуйста, покажите код, который у вас есть для поиска в вашем ProductsController, чтобы мы могли видеть уровень дублирования, которого вы ожидаете.

Ответ №1:

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

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

Как отмечали другие, это вопрос высокого уровня, поэтому я не буду вдаваться в подробности. Конечно, есть миллион способов реализовать это, просто постарайтесь придерживаться общей логики.