Можно ли сделать поиск в Laravel по двум колонкам?

Ссылка скопирована
1 ответ

Есть код, который ищет по данным из колонки title

... 'movies' => Movie::query()                     ->select(['id', 'poster', 'original_title', 'title', 'release_date'])                     ->selectRaw("concat(title, ' ', release_date) as title_and_year")                     ->when(                         fn ($query) => $query                             ->when(                                 fn ($query) => $query->having('title_and_year', 'LIKE', $search),                             )                     ) ...

... 'movies' => Movie::query() ->select(['id', 'poster', 'original_title', 'title', 'release_date']) ->selectRaw("concat(title, ' ', release_date) as title_and_year") ->when( fn ($query) => $query ->when( fn ($query) => $query->having('title_and_year', 'LIKE', $search), ) ) ...

Если написать так, то будет искать по колонке original_title

... 'movies' => Movie::query()                     ->select(['id', 'poster', 'original_title', 'title', 'release_date'])                     ->selectRaw("concat(original_title, ' ', release_date) as title_and_year")                     ->when(                         fn ($query) => $query                             ->when(                                 fn ($query) => $query->having('title_and_year', 'LIKE', $search),                             )                     ) ...

... 'movies' => Movie::query() ->select(['id', 'poster', 'original_title', 'title', 'release_date']) ->selectRaw("concat(original_title, ' ', release_date) as title_and_year") ->when( fn ($query) => $query ->when( fn ($query) => $query->having('title_and_year', 'LIKE', $search), ) ) ...

Есть ли вариант объединить их, чтобы искало по двум колонкам?

Дополнительно:

1) Вроде оба куска кода одинаковые.

2) По каким именно двум колонкам надо искать?

  • YepBro,
    1) concat отличается
    2) по title и original_title
  • havingRaw / orHavingRaw разве тут не поможет?

    Ну и второе объединенное поле обозвать по другому, например original_title_and_year.

    ->selectRaw("concat(title, ' ', release_date) as title_and_year, concat(original_title, ' ', release_date) as original_title_and_year")

    ->selectRaw("concat(title, ' ', release_date) as title_and_year, concat(original_title, ' ', release_date) as original_title_and_year")

    Или надо не совсем это?

    P.S. А еще лучше перевести поиск на Meilisearch

    • havinRaw вызывает ошибку

      Argument #2 ($bindings) must be of type array, string given

      Помогло orhaving

    • swyt, я думал ты уже orhaving проверил )

      https://laravel.com/docs/10.x/queries#havingraw-or... для havinRaw надо параметры передавать массивом

      $orders = DB::table('orders')                 ->select('department', DB::raw('SUM(price) as total_sales'))                 ->groupBy('department')                 ->havingRaw('SUM(price) > ?', [2500])                 ->get();

      $orders = DB::table('orders') ->select('department', DB::raw('SUM(price) as total_sales')) ->groupBy('department') ->havingRaw('SUM(price) > ?', [2500]) ->get();

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Да, в Laravel можно осуществить поиск по двум колонкам. Для этого можно воспользоваться методом where() с использованием оператора OR. Например, если у нас есть модель Post с колонками title и body, и мы хотим найти записи, где либо title, либо body содержат определенное значение, то код будет выглядеть следующим образом:

    $posts = Post::where('title', 'like', '%search_query%')
                 ->orWhere('body', 'like', '%search_query%')
                 ->get();

    $posts = Post::where('title', 'like', '%search_query%') ->orWhere('body', 'like', '%search_query%') ->get();

    В данном примере мы ищем записи, где либо title, либо body содержат значение 'search_query'. Оператор OR позволяет нам объединить условия поиска по двум колонкам.

    Также можно использовать метод where() с замыканием для более сложных запросов. Например, если мы хотим найти записи, где и title, и body содержат определенное значение, то код будет выглядеть следующим образом:

    $posts = Post::where(function($query) use ($search_query) {
                   $query->where('title', 'like', '%'.$search_query.'%')
                         ->where('body', 'like', '%'.$search_query.'%');
               })
               ->get();

    $posts = Post::where(function($query) use ($search_query) { $query->where('title', 'like', '%'.$search_query.'%') ->where('body', 'like', '%'.$search_query.'%'); }) ->get();

    В этом примере мы используем замыкание для создания группы условий. Метод where() внутри замыкания позволяет нам задать условия поиска для каждой колонки.

    Таким образом, в Laravel есть несколько способов осуществить поиск по двум колонкам. Выбор конкретного метода зависит от требований к поиску и структуре базы данных.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно