javascript - 如何根据我的网络中的单个字段进行多项搜索
问题描述
我正在使用 Laravel 构建一个网站,并且我想创建一个类似表单的搜索,用户可以在其中搜索使用不同类型的电影。问题是当我尝试使用超过 1 种类型时,它只显示为我的每个字段选择的最后一个选项。例如,我的搜索选项是类型和年份,我尝试输入喜剧、浪漫、动作、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'));
}
解决方案
如果您允许用户选择多个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){ ... }
推荐阅读
- c# - C# GetAllUsers() 项目已被添加。输入字典错误
- java - 如何从过滤的 jtable 中选择并显示右行?
- linux - 如何创建 ALSA 虚拟设备以将音频传送到命令?
- java - 如何在 BasicThreadFactory 中使用名称模式?
- vue.js - 固定位置 Vuetify 警报组件
- javascript - CSS 容器中的项目未正确对齐
- node.js - 文件的CORS错误:URL,最好的方法是什么?
- sqlite - 在 CMake 上找不到 SQLite3
- visual-studio-code - 寻求有关在 vscode 终端中设置 wsl 的帮助
- javascript - 在没有无头模式的 vps ubuntu 服务器上运行 puppeteer