首页 > 解决方案 > Laravel 5.6 搜索表单

问题描述

在我正在开发的应用程序中,有两个主要搜索:站点范围搜索和快速搜索。

快速搜索

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

这是我尝试过的。

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

标签: phpformslaravel

解决方案


有一种更好的方法可以结合使用条件子句和范围来实现您想要做的事情。例如...

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

在模型上设置范围后,您现在可以有选择地按任意数量的请求变量进行过滤,因此如果未设置,您不必担心。这也使您的代码更加紧凑。


推荐阅读