我想要执行这个基本查询但是错误不断出现。可能是因为我对laravel的新意。
这是代码:
$userRecord = $this->where('email', $email)->where('password', $password);
echo "first name: " . $userRecord->email;
我正在尝试获取与电子邮件和密码匹配的凭据匹配的用户记录。这是一个错误:
未定义属性:Illuminate \ Database \ Eloquent \ Builder :: $ email
我已经检查了传递给该函数的电子邮件和密码,并且它们正在保存值。这有什么问题?
谢谢,
答案 0 :(得分:34)
$this->where('email', $email)->where('password', $password)
返回一个Builder对象,您可以使用该对象在过滤器等处附加更多内容。
获得您需要的结果:
$userRecord = $this->where('email', $email)->where('password', $password)->first();
答案 1 :(得分:6)
阅读完之前的评论后,很明显你误解了Hash :: make函数。 Hash :: make使用bcrypt哈希。按照设计,这意味着每次运行Hash :: make('password')时,结果都会不同(由于随机salting)。这就是为什么你不能通过简单地针对散列输入检查散列密码来验证密码。
验证哈希的正确方法是使用:
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";
我建议您查看Laravel security documentation,因为Laravel中已存在执行此类授权的功能。
此外,如果您的定制哈希算法每次为给定输入生成相同的哈希值,则存在安全风险。一个好的单向散列算法应该使用随机salting。
答案 2 :(得分:4)
$userRecord = Model::where([['email','=',$email],['password','=', $password]])->first();
或
$userRecord = self::where([['email','=',$email],['password','=', $password]])->first();
I` 认为这个条件比2更好。它的 where条件数组在where条件的数组中;
答案 3 :(得分:3)
错误来自$userRecord->email
。从数据库调用时,您需要使用->get()
或->first()
方法,否则您只获取Eloquent\Builder
对象而不是Eloquent\Collection
->first()
方法非常明显,它将返回找到的第一行。 ->get()
返回找到的所有行
$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
答案 4 :(得分:2)
这是最短的方法。
$userRecord = Model::where(['email'=>$email, 'password'=>$password])->first();
答案 5 :(得分:1)
您需要使用first()
或get()
来获取结果$userRecord = $this->where('email', $email)->where('password', $password)->first();
。您最有可能需要使用first()
,因为您只需要返回一个结果。如果未找到记录,则会返回null
。如果您要在Eloquent类中构建此查询,则可以使用self
,例如$userRecord = self::where('email', $email)->where('password', $password)->first();
更多信息here
答案 6 :(得分:-6)
经过严格的测试,我发现我的问题来源是Hash :: make('password')。显然,这每次都会产生不同的哈希值。所以我用自己的哈希函数(先前在codeigniter中写过)和中提琴替换了它!事情很顺利。
再次感谢您的帮助:)非常感谢!