laravel 选择 where 和 where 条件
Posted
技术标签:
【中文标题】laravel 选择 where 和 where 条件【英文标题】:laravel select where and where condition 【发布时间】:2013-12-25 15:09:39 【问题描述】:我想要执行这个基本查询,但不断出现错误。可能是因为我对 laravel 很陌生。
代码如下:
$userRecord = $this->where('email', $email)->where('password', $password);
echo "first name: " . $userRecord->email;
我正在尝试获取与电子邮件和密码匹配的凭据匹配的用户记录。这是抛出一个错误:
未定义属性:Illuminate\Database\Eloquent\Builder::$email
我检查了传递给函数的电子邮件和密码,它们保存着值。这里有什么问题?
谢谢,
【问题讨论】:
顺便说一句,您可能希望查看 Eloquent 的模型范围以整理更复杂的查询。假设您的电子邮件字段实际上是带有 FK 约束的 emailId:users_emails_foreign,您可以执行以下操作:class Email extends Model class User extends Model public function scopeEmail($query) return $query->where('emailId', $Email::whereAddress("test@example.com")->first()->id);现在你可以在你的代码中调用 $user->email()->wherename("Frank"); 【参考方案1】:$userRecord = $this->where('email', $email)->where('password', $password);
在上面的代码中,你只是请求 Eloquent 对象,而不是请求数据,
$userRecord = $this->where('email', $email)->where('password', $password)->first();
这样,如果多个数据具有相同的凭据,您可以通过默认排序 DESC 和 PK 从给定凭据获取第一个数据。但是如果没有匹配的数据,您必须处理异常。 您还有另外一种选择来实现同样的目标。
$userRecord = $this->where('email', $email)->where('password', $password)->firstOrfail();
在上面的sn-ps中,在没有数据的情况下,会自动抛出404错误。
另外,你可以有其他的 sn-ps
$filter['email']=$email;
$filter['password']=$password;
$userRecord = $this->where($filter)->first();
就是这样
【讨论】:
【参考方案2】:这是最短的方法。
$userRecord = Model::where(['email'=>$email, 'password'=>$password])->first();
【讨论】:
【参考方案3】:您需要使用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
【讨论】:
我试过这个,我得到“试图获取非对象的属性”@afarazit 但它仍然不起作用,伙计。我得到了同样的错误:( 您必须更新您的问题,并提供有关您尝试运行此代码的位置的更多信息,如果可能,请提供完整的课程 我正在尝试在用户模型中运行此代码。因此我使用 $this 和 self.尽管如此,在我的控制器中,我正在调用函数 $user->login($email, $password) 这应该返回找到的用户记录。 @spacemonkey$user
在你的控制器中来自哪里?显然$user
没有正确实例化【参考方案4】:
$userRecord = Model::where([['email','=',$email],['password','=', $password]])->first();
或
$userRecord = self::where([['email','=',$email],['password','=', $password]])->first();
我` 认为这个条件比 2 哪里好。它的 where条件数组中的where条件数组;
【讨论】:
【参考方案5】:在阅读了您之前的 cmets 之后,很明显您误解了 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 中已经存在执行此类授权的功能。
此外,如果您定制的散列算法每次为给定的输入生成相同的散列,则存在安全风险。一个好的单向散列算法应该使用随机加盐。
【讨论】:
【参考方案6】:经过严格测试,我发现我的问题的根源是Hash::make('password')。显然,这每次都会生成不同的哈希值。所以我用我自己的散列函数(之前在 codeigniter 中写过)和中提琴替换了它!事情进展顺利。
再次感谢您的帮助 :) 非常感谢!
【讨论】:
散列类不会产生随机散列。 至少在我的实现中它做到了,所以我可能做错了什么。这是我的问题的解决方案,不一定适用于所有其他情况。 @LuckySoni 它生成相同的哈希 + 随机盐,因此每次结果都不同。不这样做的密码散列算法将是一个安全漏洞,因为它允许黑客进入每个帐户,如果他们可以访问散列密码。【参考方案7】:$this->where('email', $email)->where('password', $password)
正在返回一个 Builder 对象,您可以使用该对象附加更多 where 过滤器等。
要得到你需要的结果:
$userRecord = $this->where('email', $email)->where('password', $password)->first();
【讨论】:
我正在尝试获取非对象的属性 如果你在调用 $userRecord->email 时得到它;然后 $userRecord 为 null,因为查询没有返回任何记录。 是的,但为什么会这样?我回显了电子邮件和密码,两者都准确地显示了数据库中的内容。有什么我可能会忽略的吗? 密码是否存储为哈希值,您应该这样做吗?然后使用 where 子句检查将不起作用。最好使用内置的 Auth 功能来验证用户登录。 这可能是多余的查询吧【参考方案8】:错误来自$userRecord->email
。从数据库调用时,您需要使用->get()
或->first()
方法,否则您只会得到Eloquent\Builder
对象而不是Eloquent\Collection
->first()
方法非常不言自明,它将返回找到的第一行。 ->get()
返回找到的所有行
$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
【讨论】:
以上是关于laravel 选择 where 和 where 条件的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 查询生成器 where 和 or where