未定义的变量:使用高级 where 子句时 laravel 5 中的关键字错误

Undefined variable: keyword error in laravel 5 when using advanced where clause

我正在使用带参数分组的高级 where 子句。这是例子

    $users = User::where('role', 'admin')
                   ->where(function ($query){
                       $query->orWhere('id', 'LIKE', "%$keyword%")
                             ->orWhere('email', 'LIKE', "%$keyword%")
                             ->orWhere('name', 'LIKE', "%$keyword%")
                             ->paginate($perPage);
                        });

return view('admin.index', compact('users'));

这部分给我一个错误:未定义的变量:关键字

然后我在网上搜索,发现可以这样添加use($keyword, $perPage)

$users = User::where('role', 'admin')
                   ->where(function ($query) use($keyword, $perPage){
                       $query->orWhere('id', 'LIKE', "%$keyword%")
                             ->orWhere('email', 'LIKE', "%$keyword%")
                             ->orWhere('name', 'LIKE', "%$keyword%")
                             ->paginate($perPage);
                        });

但是它在我的视图文件中显示错误

调用未定义的方法Illuminate\Database\Query\Builder::appends()

抛出新的 BadMethodCallException("Call to undefined method {$className}::{$method}()");

这是 index.blade.php

中导致错误的行
{{ $users->appends(['search' => Request::get('search')])->links("pagination::bootstrap-4") }}

添加 use($keyword, $perPage) 之前不存在此错误

您需要将 use() 添加到闭包中以使其工作:

->where(function($query) use($keyword, $perPage) {

但我确定您想将分页放在闭包之外以使查询真正起作用:

User::where('role', 'admin')
    ->where(function($query) use($keyword) {
        $query->orWhere('id', 'LIKE', "%$keyword%")
            ->orWhere('email', 'LIKE', "%$keyword%")
            ->orWhere('name', 'LIKE', "%$keyword%");
    })
    ->paginate($perPage);

你在 closure 里面 paginating。像下面这样在最后尝试 paginate-

$users = User::where('role', 'admin')
               ->where(function ($query) use($keyword){
                   $query->orWhere('id', 'LIKE', "%$keyword%")
                         ->orWhere('email', 'LIKE', "%$keyword%")
                         ->orWhere('name', 'LIKE', "%$keyword%")
                         ;
                    })->paginate($perPage);