Как я могу сделать множественный поиск, основанный на отдельных полях в моей сети - PullRequest
0 голосов
/ 10 июля 2019

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

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

<form action="/home" method="GET">
    <hr>
    <h4>Genre</h4><br>
    @foreach($movies as $movie)
        <input type="checkbox" name="genre" value="{{$movie->genre}}">{{$movie->genre}}<br>
    @endforeach
    <hr>
    <h4>Year</h4>
    @foreach($movies as $movie)
        <input type="checkbox" name="year" value="{{$movie->year}}">{{$movie->year}}<br>
    @endforeach
    <input type="submit" class="btn btn-success" value="Search"><br>
</form>

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

Редактировать

Вот мой контроллер, где я делаю поиск и нумерацию страниц.

public function index(Request $request)
{
$movies = \DB::table('movies');

$queries = [];

$columns = [
  'genre','year'
];

foreach ($columns as $column) {
    if (request()->has($column)) {
        $movies = $movies->where($column, request($column));
        $queries[$column] = request($column);
    }
}
$movies = $movies->orderBy('created_at', 'desc')->paginate(20)->appends($queries);
return view('home', compact('movies'));
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Если вы разрешаете пользователю выбирать несколько значений genre и year, ваши входные данные должны быть массивами. Измените атрибут name, чтобы использовать []:

@foreach($movies as $movie)
<input type="checkbox" name="genre[]" value="{{ $movie->genre }}">{{ $movie->genre }}<br/>
@endforeach
...
@foreach($movies as $movie)
<input type="checkbox" name="year[]" value="{{ $movie->year }}">{{ $movie->year }}<br/>
@endforeach

Поскольку вы опускаете [], на сервер отправляется только последний выбранный флажок с таким же name. При этом на бэкэнде ваши значения должны быть массивами:

$selectedGenres = $request->input("genre");
// ["comedy", "romance", ...];

$selectedYears = $request->input("year");
// ["1990", "2019", ...];

Затем вы можете использовать это в простом запросе:

$foundMovies = Movie::whereIn("genre", $selectedGenres)
->whereIn("year", $selectedYears)
->get();

Вероятно, вам придется игнорировать поиск, если не выбраны значения genre или year, но это можно сделать либо с помощью проверки:

"genre" => "required|array|min:1",
"year" => "required|array|min:1"

или чек:

if(count($selectedGenres) != 0){ ... }
0 голосов
/ 11 июля 2019

, поскольку ваш цикл генерирует флажки, ваш атрибут name должен быть массивом:

@foreach($movies as $movie)
<input type="checkbox" name="genre[]" value="{{ $movie->genre }}">{{ $movie->genre }}<br/>
@endforeach

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

"genre" => "required|array",
"year" => "required|array"

наконец, ваш запрос будет выглядеть так:

$genres = $request->genre;
$years = $request->year;

Movie::when(count($genres) > 0,function ($query, $genres) {
                    return $query->whereIn('genre', $genres);
     })
     ->when(count($years) > 0,function ($query, $years) {
                    return $query->whereIn('year', $years);
     })
     ->get();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...