Laravel 搜索逻辑
Laravel search logic
在过去的两天里,我一直在尝试构建这个相对简单的搜索系统,但我就是想不通。
基本上,我有几个 select 标签,其中包含用于过滤用户的选项。
像这样:
<div class="col-sm-4">
<label for="price">Price:</label><br>
<select class="browse-select" name="price">
<option>Any</option>
<option value="1">Less than 100$</option>
<option value="2">More than 100$</option>
</select>
</div>
<div class="col-sm-4">
<label for="delivery">Delivery:</label><br>
<select class="browse-select" name="delivery">
<option>Any</option>
<option value="1">1 month or less</option>
<option value="7">7 days or less</option>
<option value="3">3 days or less</option>
</select>
</div>
这些在表格中(获取请求表格),这是我的控制器。
public function index(Request $request){
$users = User::paginate(10);
$service = Service::all();
//Search Logic
$category = $request->input('category');
$price = $request->input('price');
$delivery = $request->input('delivery');
$searchQuery = Service::with('user');
$searchQuery->where('category','=',$category);
if ($price == 1) { //price input has a value of 1 which means (less than 100)
$searchQuery->where('price','<',100)->where('category','=',$category);
}elseif($price == 2){
$searchQuery->where('price','>',100)->where('category','=',$category);
}
$result = $searchQuery->get();
return view('browse.index', compact('users','service','result'));
}
如您所见,我在用户和服务之间建立了关系。因为我需要访问用户的服务来比较值和查询数据库。
到目前为止,我所拥有的,仅适用于一个 select。如果我 select 一个类别,则可以正常工作并显示用户。但是,如果我尝试选择一个类别和价格,那么它 returns 所有用户。
我应该如何正确执行此操作?我觉得我在这里错过了一些东西..
我认为您需要添加额外的检查并拆分您的查询。像
$searchQuery = Service::with('user');
if($request->has('category'))
{
$searchQuery->where('category', $request->input('category'));
}
if($request->has('price'))
{
$operator = (1 === $request->input('price')) ? '>' : '<';
$searchQuery->where('price', $operator, 100);
}
$result = $searchQuery->get();
在过去的两天里,我一直在尝试构建这个相对简单的搜索系统,但我就是想不通。 基本上,我有几个 select 标签,其中包含用于过滤用户的选项。 像这样:
<div class="col-sm-4">
<label for="price">Price:</label><br>
<select class="browse-select" name="price">
<option>Any</option>
<option value="1">Less than 100$</option>
<option value="2">More than 100$</option>
</select>
</div>
<div class="col-sm-4">
<label for="delivery">Delivery:</label><br>
<select class="browse-select" name="delivery">
<option>Any</option>
<option value="1">1 month or less</option>
<option value="7">7 days or less</option>
<option value="3">3 days or less</option>
</select>
</div>
这些在表格中(获取请求表格),这是我的控制器。
public function index(Request $request){
$users = User::paginate(10);
$service = Service::all();
//Search Logic
$category = $request->input('category');
$price = $request->input('price');
$delivery = $request->input('delivery');
$searchQuery = Service::with('user');
$searchQuery->where('category','=',$category);
if ($price == 1) { //price input has a value of 1 which means (less than 100)
$searchQuery->where('price','<',100)->where('category','=',$category);
}elseif($price == 2){
$searchQuery->where('price','>',100)->where('category','=',$category);
}
$result = $searchQuery->get();
return view('browse.index', compact('users','service','result'));
}
如您所见,我在用户和服务之间建立了关系。因为我需要访问用户的服务来比较值和查询数据库。
到目前为止,我所拥有的,仅适用于一个 select。如果我 select 一个类别,则可以正常工作并显示用户。但是,如果我尝试选择一个类别和价格,那么它 returns 所有用户。 我应该如何正确执行此操作?我觉得我在这里错过了一些东西..
我认为您需要添加额外的检查并拆分您的查询。像
$searchQuery = Service::with('user');
if($request->has('category'))
{
$searchQuery->where('category', $request->input('category'));
}
if($request->has('price'))
{
$operator = (1 === $request->input('price')) ? '>' : '<';
$searchQuery->where('price', $operator, 100);
}
$result = $searchQuery->get();