web-dev-qa-db-fra.com

laravel sélectionnez où et où condition

J'ai cette requête de base que je veux effectuer, mais une erreur continue à arriver. Probablement en raison de ma nouveauté à Laravel.

voici le code:

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

J'essaie de faire en sorte que l'enregistrement de l'utilisateur corresponde aux informations d'identification dans lesquelles email et mot de passe correspondent. Cela jette une erreur:

Propriété non définie: Illuminate\Database\Eloquent\Builder :: $ email

J'ai vérifié le courrier électronique et le mot de passe transmis à la fonction et ils contiennent des valeurs. Quel est le problème ici?

Merci,

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

renvoie un objet Builder que vous pouvez utiliser pour ajouter plus de filtres, etc.

Pour obtenir le résultat dont vous avez besoin:

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

Après avoir lu vos commentaires précédents, il est clair que vous avez mal compris la fonction Hash :: make. Hash :: make utilise le hachage bcrypt. De par sa conception, cela signifie que chaque fois que vous exécutez Hash :: make ('mot de passe'), le résultat sera différent (en raison du caractère aléatoire salting ). C'est pourquoi vous ne pouvez pas vérifier le mot de passe simplement en vérifiant le mot de passe haché par rapport à l'entrée hachée.

La bonne façon de valider un hachage est d'utiliser:

Hash::check($passwordToCheck, $hashedPassword);

Ainsi, par exemple, votre fonction de connexion serait implémentée comme ceci:

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;
}

Et puis, tu appellerais ça comme ça:

$user = User::login('[email protected]', 'password');
if ( !$user ) echo "Invalid credentials.";
else echo "First name: $user->firstName";

Je recommande de consulter = documentation de sécurité de Laravel , car des fonctions existent déjà dans Laravel pour effectuer ce type d'autorisation).

De plus, si votre algorithme de hachage personnalisé génère le même hachage à chaque fois pour une entrée donnée, cela constitue un risque pour la sécurité. Un bon algorithme de hachage à sens unique devrait utiliser le salage aléatoire.

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

ou

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

Je pense que cette condition est meilleure que 2. Son tableau de conditions where dans un tableau de conditions where;

4
Mgorunuch

L'erreur vient de $userRecord->email. Vous devez utiliser les méthodes ->get() ou ->first() lorsque vous appelez depuis la base de données, sinon vous n'obtenez que l'objet Eloquent\Builder Plutôt qu'un Eloquent\Collection

La méthode ->first() est assez explicite, elle retournera la première ligne trouvée. ->get() renvoie toutes les lignes trouvées

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

Vous devez soit utiliser first() ou get() pour récupérer les résultats $userRecord = $this->where('email', $email)->where('password', $password)->first();. Vous aurez probablement besoin d'utiliser first() car vous souhaitez obtenir un seul résultat. Si l'enregistrement n'est pas trouvé, null sera retourné. Si vous construisez cette requête à partir d'une classe Eloquent, vous pouvez utiliser self, par exemple $userRecord = self::where('email', $email)->where('password', $password)->first();.

Plus d'infos ici

1
afarazit