我正在尝试在我的小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');
,仅获取字符串形式的类别。