laravel选择何处和何处条件

laravel选择何处和何处条件,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我有这个基本的查询,我想执行,但一个错误不断出现。可能是因为我刚到拉雷维尔 代码如下: $userRecord = $this->where('email', $email)->where('password', $password); echo "first name: " . $userRecord->email; 我正在尝试获取与凭据匹配的用户记录,其中电子邮件和密码是匹配的。这将抛出一个错误: 未定义的属性:Illumb\Database\Eloque

我有这个基本的查询,我想执行,但一个错误不断出现。可能是因为我刚到拉雷维尔

代码如下:

$userRecord = $this->where('email', $email)->where('password', $password);
        echo "first name: " . $userRecord->email;
我正在尝试获取与凭据匹配的用户记录,其中电子邮件和密码是匹配的。这将抛出一个错误:

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

我已经检查了传递给函数的电子邮件和密码,它们保存着值。这里有什么问题


谢谢,

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

$userRecord = $this->where('email', $email)->where('password', $password)->first();
您很可能需要使用
first()
,因为您只希望返回一个结果

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

例如:

$userRecord = self::where('email', $email)->where('password', $password)->first();

更多信息

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

->first()
方法非常简单,它将返回找到的第一行
->get()
返回找到的所有行

$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
正在返回一个生成器对象,您可以使用该对象附加更多where筛选器等

要获得结果,您需要:

$userRecord = $this->where('email', $email)->where('password', $password)->first();

经过严格的测试,我发现问题的根源是Hash::make('password')。显然,每次都会生成不同的散列。所以我用我自己的哈希函数(以前在codeigniter中编写)和viola替换了它!事情进展顺利


再次感谢您的帮助:)非常感谢

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

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

Hash::check($passwordToCheck, $hashedPassword);
例如,您的登录功能的实现方式如下:

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;
}
$user = User::login('email@aol.com', 'password');
if ( !$user ) echo "Invalid credentials.";
else echo "First name: $user->firstName";
然后你会这样称呼它:

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;
}
$user = User::login('email@aol.com', 'password');
if ( !$user ) echo "Invalid credentials.";
else echo "First name: $user->firstName";
我建议查看,因为Laravel中已经存在执行此类授权的功能

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

$userRecord = Model::where([['email','=',$email],['password','=', $password]])->first();

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

这是最短的方法

$userRecord = Model::where(['email'=>$email, 'password'=>$password])->first();

我试过了,我得到了“尝试获取非对象的属性”@afarazit,但仍然不起作用。我得到了同样的错误:(你必须更新你的问题,然后提供更多关于你试图在哪里运行此代码的信息,如果可能的话提供完整的类。我试图在用户模型中运行此代码。因此我使用$this和self。然而,在我的控制器中,我调用函数$User->login($email,$password)这应该会返回找到的用户记录。@spacemonkey,
$user
来自您控制器中的哪里?显然,
$user
没有正确实例化。我正在尝试获取非objective的属性。如果您在调用$userRecord->email时获取该属性,则$userRecord为空,因为查询没有返回任何rec是的,可能是这样,但为什么会这样呢?我回显了电子邮件和密码,并且都准确地显示了数据库中的内容。我可能忽略了什么?密码是否存储为散列值,您应该这样做?然后使用where子句检查将不起作用。最好使用内置的身份验证函数来验证用户登录。这是也许冗余查询不是它。散列类不会生成随机散列。至少在我的实现中,它这样做了,我可能做了一些错误。这是我问题的解决方案,不一定适用于所有其他情况。@LuckySoni它生成相同的散列+随机盐,因此每次结果都不同。pas刀剑散列算法不这样做将是一个安全缺陷,因为它允许黑客进入每个帐户,如果他们能够访问散列的密码。作为旁白,您可能希望查看Eloquent的模型范围,以整理更复杂的查询。假设您的电子邮件字段实际上是带有FK约束的emailId:users\u emails\u f例如,您可以执行以下操作:类电子邮件扩展模型{}类用户扩展模型{public function scopeEmail($query){return$query->where('emailId',$Email::whereddress('test@example.com“->first()->id);}}}现在您可以在代码中调用$user->email()->wherename(“Frank”);