#laravel #eloquent #laravel-controller #laravel-api
Вопрос:
Фон
Давайте рассмотрим гипотетический сценарий. Предположим, у нас есть пять разных таблиц в нашей базе данных,
- Клиенты
- Категории
- Продукты
- Заказы
- OderDetails
Наш клиент хочет, чтобы мы добавили панель поиска во внешний интерфейс, где пользователь может искать определенный продукт, и при нажатии кнопки поиска на интерфейсе должны отображаться соответствующие продукты.
Мой подход к решению этой проблемы
Чтобы добавить вышеупомянутую функциональность, я наткнулся на следующую стратегию.
👉 Я бы добавил поле ввода для ввода названия продукта и кнопку отправки.
👉 После нажатия кнопки «Отправить» запрос на получение будет отправлен в серверную часть. В параметрах запроса будет включено название продукта, введенное пользователем
👉 Как только запрос GET будет получен в серверную часть, я передам его в ProductsController, и в рамках метода, определенного в ProductController, я буду использовать модель продукта для запроса таблицы products, чтобы узнать, есть ли какие-либо совпадающие результаты.
👉 Если есть какие-либо совпадающие результаты, я отправлю их на интерфейс внутри объекта JSON, а если нет никаких совпадающих результатов, я установлю флаг успеха false внутри объекта JSON и отправлю его на интерфейс
👉 Во внешнем интерфейсе, если есть какие-либо совпадающие результаты, я отобразю их на экране. В противном случае я выведу сообщение «Результаты не найдены!».
Проблема с моим подходом
Все работает нормально, если мы хотим выполнить поиск только в таблице продуктов. Но что, если позже наш клиент скажет нам что-то вроде: «Помните ту функцию поиска, которую вы добавили для продуктов? Я подумал, что функциональность также должна быть добавлена в заказы. Я думаю, что по мере того, как список заказов пользователя растет и растет, они также должны иметь возможность искать свои предыдущие заказы».
👉 Теперь, поскольку в нашем предыдущем подходе к поиску продуктов был реализован в ProductController с использованием модели продукта, когда мы добавляем ту же функциональность в Заказы, НАМ ПРИДЕТСЯ ДЕЛАТЬ ТО ЖЕ САМОЕ, ЧТО МЫ ДЕЛАЛИ В ProductsController СНОВА ВНУТРИ OrdersController, ИСПОЛЬЗУЯ модель заказа. Не требуется нескольких секунд, чтобы понять, что это приводит к дублированию кода.
Краткое описание проблемы
❓ Как мы добавляем конечную точку API в laravel для функции поиска, которую можно использовать для поиска в любой таблице нашей базы данных и получения результатов, вместо того, чтобы функция поиска ограничивалась конкретным контроллером и соответствующей моделью?
Комментарии:
1. Добро пожаловать в SO, здесь мы поможем вам с вашим кодом. Мы не учим вас, как что-то строить.
2. не могли бы вы показать, что вы сделали до сих пор
3. Вы просите логики! посмотрите на запросы к базе данных, особенно «объединение» для поиска в нескольких таблицах реляционной базы данных
4. Возможно, вам захочется взглянуть на прицелы . Их можно использовать для фильтрации моделей. Например, в текстовых полях модели можно выполнить поиск с помощью строки запроса. Теперь вам нужно только просмотреть все модели, с которыми вы хотите выполнить поиск, и предоставить красноречивость остальным.
5. Пожалуйста, покажите код, который у вас есть для поиска в вашем ProductsController, чтобы мы могли видеть уровень дублирования, которого вы ожидаете.
Ответ №1:
Хорошим началом было бы создать признак, называемый чем-то вроде searchable
, и добавить его ко всем моделям, которые вы хотите найти, и поместить туда любую общую логику между различными моделями. Возможно, вы захотите вручную разрешить разные столбцы, чтобы в каждой модели у вас был массив доступных для поиска столбцов, на которые вы бы ссылались в своей характеристике.
Ваш контроллер должен будет указать на соответствующую модель и вызвать метод в черте, которая выполняет поиск.
Как отмечали другие, это вопрос высокого уровня, поэтому я не буду вдаваться в подробности. Конечно, есть миллион способов реализовать это, просто постарайтесь придерживаться общей логики.