繁体   English   中英

如何使用 Laravel 8 查询生成器,如 eloquent 进行搜索

[英]how to use Laravel 8 query builder like eloquent for searching

我正在使用 Laravel 8 开发一个需要在查询字符串中搜索的简单 CRM。

我的查询字符串如下所示:

http://127.0.0.1:8000/admin/users/supervisor?q=john&gender=m

现在的问题是如何在 controller 中搜索?

我想这样做:

public function index (Request $request)
{
    $role = getRoleCode($request->role);
    $roles = Role::where('role', '=', $role);

    if ($request->q) {
        $roles->where('name', 'like', "%$request->$q%");
    }

    if ($request->gender) {
        $roles->where('gender', '=', $request->gender);
    }

    $role->orderBy('id', 'desc')->paginate(20);

    return view('admin.users.index', [
        'roles' => $roles,
        'role_name' => config('settings.roles')[$role],
        'role_en_name' => $request->role,
        'q' => $request->q,
        'gender' => $request->gender
    ]);
}

我想知道为什么它不起作用以及执行此操作的标准方法是什么。

我试过了:

Role::query();

但这也没有用。

我也试过:

$roles = Role::where('role', '=', $role)
    ->where('name', 'like', "%$request->$q%")
    ->where('gender', '=', $request->gender)
    ->orderBy('id', 'desc')
    ->paginate(20);

此代码完美运行,但我们可能不会发送“q”或“gender”URL 参数。

PS:对不起我的英语不好:)

如果您想有条件地将where语句添加到查询中,您可以使用if语句,就像您尝试做的那样,或者使用 Eloquent/Query Builder 的when方法:

$roles = Role::where('role', $role)
    ->when($request->input('q'), fn ($query, $search) => $query->where('name', 'like', '%'. $search .'%'))
    ->when($request->input('gender'), fn ($query, $gender) => $query->where('gender', $gender))
    ->orderBy('id', 'DESC')
    ->paginate(20);

Laravel 8.x Docs - Queries - Conditional Clauses when

与 when() 一起工作会更好

->when(true, function($query){$query->where('x', x);})

你的路线应该是这样的:

Route::get('/admin/users/{role}', [YourController::class, 'index']);

您的索引 function 将是这样的:

public function index (Request $request,$role)
{
   //old line $role = getRoleCode($request->role);
    $role = getRoleCode($role);
    $roles = Role::where('role', '=', $role);

    if ($request->q) {
        $roles->where('name', 'like', "%$request->$q%");
    }
    if ($request->gender) {
        $roles->where('gender', '=', $request->gender);
    }

    $role->orderBy('id', 'desc')->paginate(20);
    return view('admin.users.index', [
        'roles' => $roles,
        'role_name' => config('settings.roles')[$role],
        'role_en_name' => $request->role,
        'q' => $request->q,
        'gender' => $request->gender
    ]);
}

Mohamed 先生有一个错误是 $roles 而不是 $role

//$roles->orderBy('id', 'desc')->paginate(20)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM