Laravel 5.6搜索表单

时间:2018-05-02 12:32:17

标签: php forms laravel

在我正在开发的应用中,有两个主要搜索:网站搜索和快速搜索。

快速搜索

快速搜索必须接受角色,用户和部门,并返回符合条件的所有用户。我已经看到了一个潜在的问题,你可以选择一个不属于某个部门的角色......但无论如何。

这就是我尝试过的。

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

1 个答案:

答案 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);
});

在模型上设置范围后,您现在可以选择性地过滤任意数量的请求变量,这样您就不必担心它是否未设置。这也使您的代码更加紧凑。