Laravel Eloquent - не извлекает требуемые строки

Используя поле поиска в приложении, в базе данных есть 2 таблицы, как показано ниже:

 ________________
|**Services**
 ________________
|=>id
|=>name
|=>description
|=>other_columns
________________

и:

 ________________
|**Products**
 ________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________

=> каждый Услуга содержит много Продукты

=> Из-за формы окна поиска:

Laravel Eloquent - не извлекает требуемые строки

пользователь может выполнить поиск слова для products и по выбору выбрать услугу, таким образом, красноречие, которое я использую для получения результатов для:

  1. если пользователь не выбрал конкретную услугу ищет в:

    $data = Product::where('name','like',"%$search_value%")
            ->orWhere('description','like',"%$search_value%")
            ->orWhere('description_long','like',"%$search_value%")
            ->paginate($items_per_page);
    
  2. если пользователь выбрал конкретную услугу:

    $data = Product::where([
                ['name','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description_long','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->paginate($items_per_page);
    

Отношения Модели выглядят следующим образом:

  1. Продукт Модель:

    public function service(){
        return $this->belongsTo(Service::class);
    }
    
  2. Услуга Модель:

    public function products(){
        return $this->hasMany(Product::class);
    }
    

В обоих случаях $data всегда содержат все строки продуктов. как добиться нужного результата?

используйте где Сырье вместо where.

Inzamam Idrees 15.12.2018 12:23

Я читал документы whereRaw, но не могли бы вы объяснить разницу?

Poula Adel 15.12.2018 12:55
WhereRaw () - это функция построителя запросов Laravel, которая помещает ваши данные в том виде, в котором они есть в предложении where SQL-запроса. Думайте об этом как о функции где(), входной аргумент которой не будет обрабатываться перед вставкой в ​​запросы.
Inzamam Idrees 15.12.2018 13:16

Почему вы тоже используете знаки процента в своих строках =?

TimSch 15.12.2018 16:03

Он должен быть таким же, но во всех предложениях используется следующий синтаксис: '%'.$search_input.'%'. Пожалуйста, попробуйте это.

TimSch 15.12.2018 16:05

Я пробовал '%'.$search_input.'%', но результат тот же

Poula Adel 15.12.2018 16:29

почему service_id имеет % в этих ['service_id','=',"%$service%"]? не должно быть так ['service_id','=',$service]?

Ahmed Nour Jamal El-Din 15.12.2018 18:01

@ AhmedNourJamalEl-Din, это проблема, она решила проблему .. не могли бы вы написать это как ответ, чтобы быть понятным другим? плюс еще одна небольшая проблема, я использую lorem text (притворщик) для создания фиктивных данных ... поэтому, если я ищу любое слово, оно всегда будет найдено, т.е. ищу слово лорема

Poula Adel 16.12.2018 11:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
8
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать when() для построения динамических запросов на основе вашего пользовательского ввода.

$data = Product::query()
    ->when($request->get('service_id') ,function($query, $service_id) {
        $query->where('service_id', $service_id);
    })
    ->where(function($query) use ($search_value) {
        $query->where(('name', 'like', "%$search_value%"))
            ->orWhere('description', 'like', "%$search_value%")
            ->orWhere('description_long', 'like', "%$search_value%");
    })
    ->paginate($items_per_page);

Вложив условия полнотекстового поиска в другое предложение where(), нам не нужно повторять часть where('service_id', $service_id) несколько раз.

Если вы используете опцию выбора All Services в своем интерфейсе с value = "all", вы также можете использовать следующее предложение when() вместо приведенного выше:

->when($request->filled('service_id') && $request->get('service_id') !== 'all', function ($query) use ($request) {
    $query->where('service_id', $request->get('service_id'));
})

В % есть ['service_id','=',"%$service%"], и его нужно удалить ['service_id','=',$service].

% работает с LIKE, но не с =.

Если вы ищете способ улучшить свой поиск, ознакомьтесь с этим упаковка

Ahmed Nour Jamal El-Din 16.12.2018 18:14

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