Можно ли сделать поиск в Laravel по двум колонкам?
Есть код, который ищет по данным из колонки 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) По каким именно двум колонкам надо искать?
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();
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Да, в Laravel можно осуществить поиск по двум колонкам. Для этого можно воспользоваться методом where() с использованием оператора OR. Например, если у нас есть модель Post с колонками title и body, и мы хотим найти записи, где либо title, либо body содержат определенное значение, то код будет выглядеть следующим образом:
$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();
В этом примере мы используем замыкание для создания группы условий. Метод where() внутри замыкания позволяет нам задать условия поиска для каждой колонки.
Таким образом, в Laravel есть несколько способов осуществить поиск по двум колонкам. Выбор конкретного метода зависит от требований к поиску и структуре базы данных.