在拉拉维尔中简单搜索



我正在尝试在我的小laravel项目中构建一个搜索系统,但考虑到我仍然是初学者,我不知道这应该如何工作。

基本上,我有一个控制器,它返回所有用户的索引页。在索引页面中,我有多个选择标签,您可以在其中选择一个选项并过滤用户。

这是我的索引方法:

public function index(){
  $users = User::all();
  $service = Service::all();
  return view('browse.index', compact('users','service'));
}

现在,问题是,我在用户和服务之间建立了关系。因此,每个用户都有许多服务。考虑到这一点,当我构建搜索功能时,我希望能够访问用户服务。像这样:

  $category = $request->input('category');
  foreach ($users as $user) {
    $serviceFound = $user->service->where('category', 'LIKE', '%' . $category . '%');
  }

当然,这是行不通的,因为考虑到我的索引有一个获取路由,我不知道如何设置表单以便我可以使用$request。我希望这是清楚的...也许你们可以帮助我设置表格/路线,并清除我应该如何做到这一点的想法......

也使用 GET 构建一个简单的表单。简单示例

<form action="" method="GET">
    <input type="text" name="category" required/>
    <button type="submit">Submit</button>
</form>

在您的控制器中,您执行

public function index(Request $request){
    $category = $request->input('category');
    //now get all user and services in one go without looping using eager loading
    //In your foreach() loop, if you have 1000 users you will make 1000 queries
    $users = User::with('services', function($query) use ($category) {
         $query->where('category', 'LIKE', '%' . $category . '%');
    })->get();
    return view('browse.index', compact('users'));
}

仅当您正确设置了关系时,预先加载才会起作用。
保持您的路线不变。

在控制器中:

public function index(Request $request)
{
    return $request::all();
}

在您的路线中:

Route::get('searchtest', 'SearchController@index');

示例网址:

http://localhost:8000/searchtest?search=search_string&category=socks

最后,输出

{
  "search": "search_string",
  "category": "socks"
}

您还可以执行$category = $request::get('category');,仅获取字符串形式的类别。