【问题标题】:如何使用像 eloquent 这样的 Laravel 8 查询构建器进行搜索
【发布时间】:2022-01-20 15:09:53
【问题描述】:

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

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

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

现在的问题是如何在控制器中搜索?

我想这样做:

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”网址参数。

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

【问题讨论】:

  • 您没有将调用结果保存到返回结果的paginate,您正在将构建器传递给您的视图,而不是查询的结果......而且您似乎是在您的代码中混淆$role$roles ...虽然我猜这似乎是“伪代码”?
  • 如果你要基于条件链接一个查询,我发现你的查询命名不同于结果有很大帮助,比如$query = Role::where('role', $role);,然后在每个if 语句中:@987654330 @,完成后,$results = $query->latest('id')->paginate(20);。这样一来,$query$result 就截然不同了。 $role$roles,带有方法链接等可能(并且是)导致一些混乱。

标签: php laravel search eloquent query-string


【解决方案1】:

如果您想有条件地将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 Clauseswhen

【讨论】:

    【解决方案2】:

    使用 when() 会更好

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

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2020-03-19
      • 1970-01-01
      • 2022-01-25
      • 2016-03-30
      • 2016-02-09
      相关资源
      最近更新 更多