我正在使用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'));
}
答案 0 :(得分:2)
如果您允许用户选择多个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){ ... }
答案 1 :(得分:0)
由于您的循环会生成复选框,因此您的“名称”属性必须为数组:
@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();