web-dev-qa-db-ja.com

laravel場所と場所の条件を選択

この基本的なクエリを実行したいのですが、エラーが繰り返し表示されます。おそらく、ララベルの新しさのせいでしょう。

コードは次のとおりです。

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

メールとパスワードが一致する資格情報と一致するユーザーレコードを取得しようとしています。これはエラーを投げています:

未定義のプロパティ:Illuminate\Database\Eloquent\Builder :: $ email

関数に渡されるメールとパスワードを確認しましたが、値を保持しています。ここで何が問題ですか?

おかげで、

28
spacemonkey
$this->where('email', $email)->where('password', $password) 

フィルターなどを追加するために使用できるBuilderオブジェクトを返しています。

必要な結果を得るには:

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

以前のコメントを読んだ後、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セキュリティドキュメント を確認することをお勧めします。

さらに、カスタムハッシュアルゴリズムが特定の入力に対して毎回同じハッシュを生成する場合、セキュリティリスクになります。優れた一方向ハッシュアルゴリズムでは、ランダムソルティングを使用する必要があります。

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

または

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

私はこの条件が2よりも良いと思います。 where条件の配列内のwhere条件配列。

4
Mgorunuch

エラーは_$userRecord->email_から発生しています。データベースから呼び出すときは->get()または->first()メソッドを使用する必要があります。そうしないと、_Eloquent\Builder_ではなく_Eloquent\Collection_オブジェクトのみを取得します。

->first()メソッドは一目瞭然で、見つかった最初の行を返します。 ->get()は見つかったすべての行を返します

_$userRecord = Model::where('email', '=', $email)->where('password', '=', $password)->get();
echo "First name: " . $userRecord->email;
_
3
Wader

結果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();

詳細 こちら

1
afarazit