【问题标题】:Laravel search logicLaravel 搜索逻辑
【发布时间】:2017-03-25 15:11:06
【问题描述】:

在过去的两天里,我试图构建这个相对简单的搜索系统,但我就是想不通.. 基本上,我有一些选择标签,其中包含过滤用户的选项。 像这样的:

  <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'));
}

如您所见,我在用户和服务之间建立了关系。因为我需要访问用户的服务才能比较值并查询数据库。

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

【问题讨论】:

    标签: laravel laravel-5 laravel-5.3 laravel-5.4


    【解决方案1】:

    我认为您需要添加额外的检查并拆分您的查询。类似的东西

    $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();
    

    【讨论】:

    • 这行得通,谢谢!但是现在我遇到了另一个问题。当我显示所有用户时,我得到了重复。因此,如果一个用户在显示所有用户时有两个或更多服务,他会显示两次..
    • 在执行 SQL 查询时使用 Group by。这将确保每个用户只显示一次。 $searchQuery->groupby("用户名")
    • 这个答案引导我解决问题。感谢 aleksejjj,也感谢 ThomasK 的提示。 :)
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多