【发布时间】:2018-05-02 12:32:17
【问题描述】:
在我正在开发的应用程序中,有两个主要搜索:站点范围搜索和快速搜索。
快速搜索
快速搜索必须获取角色、用户和部门,并返回所有符合条件的用户。我已经看到了一个潜在的问题,即您可以选择一个不在部门中的角色......但无论如何。
这是我尝试过的。
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);
}
【问题讨论】: