在我正在开发的应用中,有两个主要搜索:网站搜索和快速搜索。
快速搜索
快速搜索必须接受角色,用户和部门,并返回符合条件的所有用户。我已经看到了一个潜在的问题,你可以选择一个不属于某个部门的角色......但无论如何。
这就是我尝试过的。
public function userSearch(Request $request)
{
$department = $request->get('department');
$role = $request->get('role');
$location = $request->get('location');
$users = User::where('department', $department)
->where('role', $role)
->where('location', $location)
->get();
foreach($users as $user)
{
echo '<br />' . $user->username;
}
}
虽然用户,角色和部门是下拉框并且可能没有选择任何内容,但它变得复杂。
因此,如果我只搜索Digital作为部门,则查询字符串为:
http://127.0.0.1:8000/usersearch?department=Digital&role=&location=
显然,这不会返回任何内容,因为我使用了多个where子句。
我是否必须单独检查每个变量是否为空并构造查询?这看起来有点粗略,因为我必须检查每个可能的顺序才能使查询正确。
网站搜索
另一个搜索是一个网站搜索,它接受一个查询字符串,这是我愚蠢的基本方法启动:
public function search(Request $request)
{
$search = $request->get('q');
return view('pages.search.index', compact('search'));
}
我在Laravel文档中读到有一个名为Scout的软件包,但是在给定查询字符串的情况下,是否有更基本的方法可以从每个模型中获取所有内容?
我想回来的事情:
我有与上述所有数据库表关联的模型,所以我可以执行以下操作吗?
users = User::where('name', 'like', '%' . Input::get('name') . '%')
->orWhere('name', 'like', '%' . Input::get('name') . '%')
articles= Article::where('name', 'like', '%' . Input::get('name') . '%')
->orWhere('name', 'like', '%' . Input::get('name') . '%')
依旧......
然后在显示结果时:
return('nameofview', compact('users', 'articles')
或者这可能是缓慢而繁琐的?
更新
对于网站范围内的搜索,目前我只有:
public function search(Request $request)
{
$search = $request->get('q');
$users = User::where('username', 'like', '%' . $request->get('q') . '%')
->orWhere('displayName', 'like', '%' . $request->get('q') . '%')
->orWhere('email', 'like', '%' . $request->get('q') . '%')
->orWhere('role', 'like', '%' . $request->get('q') . '%')
->orWhere('department', 'like', '%' . $request->get('q') . '%')
->orWhere('location', 'like', '%' . $request->get('q') . '%')
->orWhere('directDialIn', 'like', '%' . $request->get('q') . '%')
->orWhere('mobileNumber', 'like', '%' . $request->get('q') . '%')->get();
return view('pages.search.index', compact('search', 'users'));
}
对于快速搜索,我添加了一些查询范围
/**
* Scope a query by department
*/
public function scopeByDepartment($query, $department)
{
return $query->where('department', $department);
}
/**
* Scope a query by role
*/
public function scopeByRole($query, $role)
{
return $query->where('role', $role);
}
/**
* Scope a query by location
*/
public function scopeByLocation($query, $location)
{
return $query->where('location', $location);
}
答案 0 :(得分:1)
使用条件子句和范围的组合,有更好的方法来实现您想要做的事情。例如......
User::all()->when(isset($request->department), function ($q) use ($request) {
$q->byDepartment($request->department);
})
->when(isset($request->role), function($q) use ($request) {
$q->byRole($request->role);
});
在模型上设置范围后,您现在可以选择性地过滤任意数量的请求变量,这样您就不必担心它是否未设置。这也使您的代码更加紧凑。