laravel选择条件的位置和地点

spa*_*key 29 laravel eloquent laravel-4

我有这个我想要执行的基本查询但是错误不断出现.可能是因为我对laravel的新意.

这是代码:

$userRecord = $this->where('email', $email)->where('password', $password);
        echo "first name: " . $userRecord->email;
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取与电子邮件和密码匹配的凭据匹配的用户记录.这是一个错误:

未定义的属性:Illuminate\Database\Eloquent\Builder :: $ email

我已经检查了传递给函数的电子邮件和密码,并且它们持有值.这里有什么问题?

谢谢,

小智 35

$this->where('email', $email)->where('password', $password) 
Run Code Online (Sandbox Code Playgroud)

正在返回一个Builder对象,您可以使用该对象在过滤器等处附加更多内容.

要获得您需要的结果:

$userRecord = $this->where('email', $email)->where('password', $password)->first();
Run Code Online (Sandbox Code Playgroud)


afa*_*zit 11

您需要使用first()get()获取结果:

$userRecord = $this->where('email', $email)->where('password', $password)->first();
Run Code Online (Sandbox Code Playgroud)

您很可能需要使用,first()因为您只想返回一个结果。

如果未找到记录,null将返回。如果您是从 Eloquent 类内部构建此查询,则可以使用self.

例如 :

$userRecord = self::where('email', $email)->where('password', $password)->first();
Run Code Online (Sandbox Code Playgroud)

更多信息在这里


Mgo*_*uch 11

$userRecord = Model::where([['email','=',$email],['password','=', $password]])->first();
Run Code Online (Sandbox Code Playgroud)

或者

$userRecord = self::where([['email','=',$email],['password','=', $password]])->first();
Run Code Online (Sandbox Code Playgroud)

我认为这个条件比 2 好。它的 where 条件数组在 where 条件数组中;


Ton*_*rra 6

阅读完之前的评论后,很明显你误解了Hash :: make函数.Hash :: make使用bcrypt哈希.按照设计,这意味着每次运行Hash :: make('password')时,结果都会不同(由于随机salting).这就是为什么你不能通过简单地针对散列输入检查散列密码来验证密码.

验证哈希的正确方法是使用:

Hash::check($passwordToCheck, $hashedPassword);
Run Code Online (Sandbox Code Playgroud)

因此,例如,您的登录功能将实现如下:

public static function login($email, $password) {
    $user = User::whereEmail($email)->first();
    if ( !$user ) return null;  //check if user exists
    if ( Hash::check($password, $user->password) ) {
        return $user;
    } else return null;
}
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它:

$user = User::login('email@aol.com', 'password');
if ( !$user ) echo "Invalid credentials.";
else echo "First name: $user->firstName";
Run Code Online (Sandbox Code Playgroud)

我建议查看Laravel安全文档,因为Laravel中已存在执行此类授权的功能.

此外,如果您的定制哈希算法每次为给定输入生成相同的哈希值,则存在安全风险.一个好的单向散列算法应该使用随机salting.


Wad*_*der 5

错误来自$userRecord->email. 从数据库调用时,您需要使用->get()or->first()方法,否则您只会获取Eloquent\Builder对象而不是Eloquent\Collection

->first()方法是不言自明的,它将返回找到的第一行。->get()返回找到的所有行

$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
Run Code Online (Sandbox Code Playgroud)