laravel first()方法的概念

时间:2019-06-09 16:03:42

标签: laravel eloquent

laravel first()方法非常简单,这就是为什么这个问题可能很愚蠢的原因,但是我不理解first()方法的使用。

实际上,我正在关注一个youtube教程,其中我在对用户进行身份验证,如果该用户具有admin的角色,则只有他才能获得route的访问权限,否则将被重定向到{{1 }}。

除了我的理解之外,代码没有任何错误或问题。

如果用户具有中间件传递的角色,我将在home模型类函数中返回用户

路线

User

中间件

Route::get('admin', function (){
     return 'This is Admin page';
})->middleware(['auth', 'auth.admin']);

用户模式

public function handle($request, Closure $next)
{
    if (Auth::user()->hasAnyRole('admin'))
    {
        return $next($request);
    }
    return redirect('home');
}

如果我在public function hasAnyRole($role) { return null !== $this->roles()->where('name', $role)->first(); } 函数中使用first()方法,那么只有hasAnyRole受其他用户的保护,只有route可以访问该路由, 如果我删除了admin方法,那么所有用户都可以访问first(),但我不知道为什么?

1 个答案:

答案 0 :(得分:3)

根据文档:

  

第一个方法返回通过给定的真实性测试的集合中的第一个元素:

collect([1, 2, 3, 4])->first(function ($value, $key) {
    return $value > 2;
});
// 3
  

您也可以调用不带参数的第一个方法来获取集合中的第一个元素。如果集合为空,则返回null:

collect([1, 2, 3, 4])->first();
// 1

在您的问题中,如果您不使用first()方法,它将返回一个没有数据的集合,例如:

Roles {#1
    []
}

此空集合不等于null

关于!==运算符

$x !== $y

前一个代码段,如果$ x不等于$ y或它们不是同一类型,则返回true。

因此,在您的代码中:

return null !== $this->roles()->where('name', $role)->first();

当(且仅当)用户不具有必需的角色(通​​过true方法完成的操作)时,它将返回first()

$this->roles()->where('name', 'admin')->first();

如果用户没有admin角色,则返回nullnull是相同类型的(在您的比较中)。因此它返回false,导致null !== null返回false,并且不授予访问权限。

如果您使用类似

$this->roles()->where('name', 'admin');

并且用户没有admin角色,它将返回类似以下内容的内容:

Roles {#1
    []
}

现在,您的hasAnyRole函数将返回true,并且将访问权授予用户,因为空集合不是同一类型,并且也不等于null;

有关first方法的文档。