この基本的なクエリを実行したいのですが、エラーが繰り返し表示されます。おそらく、ララベルの新しさのせいでしょう。
コードは次のとおりです。
$userRecord = $this->where('email', $email)->where('password', $password);
echo "first name: " . $userRecord->email;
メールとパスワードが一致する資格情報と一致するユーザーレコードを取得しようとしています。これはエラーを投げています:
未定義のプロパティ:Illuminate\Database\Eloquent\Builder :: $ email
関数に渡されるメールとパスワードを確認しましたが、値を保持しています。ここで何が問題ですか?
おかげで、
$this->where('email', $email)->where('password', $password)
フィルターなどを追加するために使用できるBuilderオブジェクトを返しています。
必要な結果を得るには:
$userRecord = $this->where('email', $email)->where('password', $password)->first();
以前のコメントを読んだ後、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 protected]', 'password');
if ( !$user ) echo "Invalid credentials.";
else echo "First name: $user->firstName";
このタイプの認証を実行するための関数がLaravelに既に存在するため、 Laravelセキュリティドキュメント を確認することをお勧めします。
さらに、カスタムハッシュアルゴリズムが特定の入力に対して毎回同じハッシュを生成する場合、セキュリティリスクになります。優れた一方向ハッシュアルゴリズムでは、ランダムソルティングを使用する必要があります。
$userRecord = Model::where([['email','=',$email],['password','=', $password]])->first();
または
$userRecord = self::where([['email','=',$email],['password','=', $password]])->first();
私はこの条件が2よりも良いと思います。 where条件の配列内のwhere条件配列。
エラーは_$userRecord->email
_から発生しています。データベースから呼び出すときは->get()
または->first()
メソッドを使用する必要があります。そうしないと、_Eloquent\Builder
_ではなく_Eloquent\Collection
_オブジェクトのみを取得します。
->first()
メソッドは一目瞭然で、見つかった最初の行を返します。 ->get()
は見つかったすべての行を返します
_$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
_
結果first()
を取得するには、get()
または$userRecord = $this->where('email', $email)->where('password', $password)->first();
を使用する必要があります。 1つの結果のみが返されるようにするには、first()
を使用する必要があります。レコードが見つからない場合、null
が返されます。 Eloquentクラス内からこのクエリを構築する場合は、self
を使用できます。たとえば、$userRecord = self::where('email', $email)->where('password', $password)->first();
詳細 こちら