Laravel 使用无条件查找和动态 where 条件

Laravel using find without condition and dynamic where condition

我想查询一个 eloquent 方法然后进行分页。所以我把代码写成

    $roles = Role::find();
    if (!empty($request->get("globalFilter"))){
        $roles->where('name','LIKE','%' . $request->get("globalFilter"). '%');
    }
    return response()->json($roles->paginate($request->get("perPage")));

以上抛出如下错误

too few arguments on function builder find

如何在上面的查询中调用 wherepaginate

首先你必须将一个值传递给 find() 方法作为 parameter.So 它会根据给定的 id return 一条记录。如果你没有 id 并且想先获取记录然后你必须使用first()。 您还使用分页 return 结果,我认为您不需要 find() 方法。

应该是

 $roles = Role::query();
    if (!empty($request->get("globalFilter"))){
        $roles->where('name','LIKE','%' . $request->get("globalFilter"). '%');
    }

$result=$roles->find($id);

或者您可以在 where 回调中使用 if 条件,如下所示

$roles = Role::where(function ($query)use($request){
    if(!empty($request->globalFilter)){
        $query->where('name','LIKE','%' . $request->get("globalFilter"). '%');
    }
    
})->find($id);

或者您可以使用 when 使查询更简单

$roles = Role::when((!empty($request->globalFilter)),function($query)use($request){

    $query->where('name','LIKE','%' . $request->get("globalFilter"). '%');
})->find($id);

注意: 对于 find() 方法,您必须将一个参数作为 id 传递,或者您必须使用 first()。两者都 return一条record.For多条记录可以用all()get()

when 子句参考:https://laravel.com/docs/8.x/queries#conditional-clauses

first() 和 find() 参考:https://laravel.com/docs/8.x/queries#retrieving-a-single-row-column-from-a-table

如果您正在寻找 return 名称类似的所有角色,那么您可以执行以下操作

 $roles = Role::when((!empty($request->globalFilter)),function($query)use($request){
    
        $query->where('name','LIKE','%' . $request->get("globalFilter"). '%');
    })->paginate($request->get("perPage"));