Laravel 拉威尔搜索逻辑

Laravel 拉威尔搜索逻辑,laravel,laravel-5,laravel-5.3,laravel-5.4,Laravel,Laravel 5,Laravel 5.3,Laravel 5.4,在过去的两天里,我一直在尝试建立一个相对简单的搜索系统,但我就是搞不懂。。 基本上,我有几个select标签,其中包含过滤用户的选项。。 大概是这样的: <div class="col-sm-4"> <label for="price">Price:</label><br> <select class="browse-select" name="price"> <option>Any</

在过去的两天里,我一直在尝试建立一个相对简单的搜索系统,但我就是搞不懂。。 基本上,我有几个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>

价格:
任何 少于100$ 百余$ 交付:
任何 1个月或以下 7天或更少 3天或更少
这是一个表单(get请求表单),这是我的控制器

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'));
}
公共功能索引(请求$Request){
$users=用户::分页(10);
$service=service::all();
//搜索逻辑
$category=$request->input('category');
$price=$request->input('price');
$delivery=$request->input('delivery');
$searchQuery=Service::with('user');
$searchQuery->where('category','=',$category);
如果($price==1){//price输入的值为1,表示(小于100)
$searchQuery->where('price','''100)->where('category','=',$category);
}
$result=$searchQuery->get();
返回视图('browse.index',compact('users','service','result');
}
正如你所看到的,我在用户和服务之间有一种关系。因为我需要访问用户的服务,以便比较值和查询数据库

到目前为止,我所拥有的只适用于一种选择。如果我选择了一个类别,它可以正常工作并显示用户。但是,例如,如果我尝试选择一个类别和一个价格,那么它将返回所有用户。
我应该如何正确地做到这一点?我觉得这里遗漏了一些东西。

我认为您需要添加额外的检查并拆分查询。差不多

$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();
$searchQuery=Service::with('user');
如果($request->has('category'))
{
$searchQuery->where('category',$request->input('category');
}
如果($request->has('price'))
{

$operator=(1==$request->input('price')?“>”:“我认为您需要添加额外的检查并拆分查询。类似于

$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();
$searchQuery=Service::with('user');
如果($request->has('category'))
{
$searchQuery->where('category',$request->input('category');
}
如果($request->has('price'))
{

$operator=(1==$request->input('price'))?“>”:“这很有效,谢谢!但现在我遇到了另一个问题..当我显示所有用户时,我会得到重复项。因此,如果一个用户在显示所有用户时有两个或更多服务,他会显示两次..在执行SQL查询时使用Group by。这将确保每个用户只显示一次。$searchQuery->groupby(“用户名”)这个答案引导我解决了这个问题。感谢Aleksejj,也感谢ThomasK提供的提示:)这很有效,谢谢!但现在我遇到了另一个问题..当我显示所有用户时,我会得到重复的服务。因此,如果一个用户在显示所有用户时有两个或更多服务,他会显示两次..在执行SQL查询时使用Group by。这是我将确保每个用户只显示一次。$searchQuery->groupby(“用户名”)此答案将引导我解决问题。感谢Aleksejj,也感谢ThomasK提供的提示。:)