Laravel выбирает где и где условие

У меня есть этот базовый запрос, который я хочу выполнить, но ошибка продолжает расти. Вероятно, из-за моей новизны в ларавеле.

вот код:

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

Я пытаюсь получить учетную запись пользователя, соответствующую учетным данным, где адрес электронной почты и пароль совпадают. Это вызывает ошибку:

Undefined свойство: Illuminate\Database\Eloquent\Builder:: $email

Я проверил адрес электронной почты и пароль, переданные функции, и они сохраняют значения. в чем проблема?

Спасибо,

Ответы

Ответ 1

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

возвращает объект Builder, который вы можете использовать для добавления большего количества фильтров и т.д.

Чтобы получить нужный результат:

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

Ответ 2

После прочтения ваших предыдущих комментариев ясно, что вы неправильно поняли функцию Hash:: make. Hash:: make использует хэширование bcrypt. По дизайну это означает, что каждый раз, когда вы запускаете Hash:: make ('password'), результат будет другим (из-за случайного соления). Поэтому вы не можете проверить пароль, просто проверив хешированный пароль на хешированный вход.

Правильный способ проверки хэша заключается в использовании:

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 для выполнения этого типа авторизации.

Кроме того, если ваш собственный алгоритм хэширования генерирует один и тот же хэш каждый раз для данного ввода, это представляет собой угрозу безопасности. Хороший алгоритм одностороннего хеширования должен использовать случайное засоление.

Ответ 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

Вам нужно либо использовать first(), либо get() для получения результатов $userRecord = $this->where('email', $email)->where('password', $password)->first();. Скорее всего, вам нужно будет использовать first(), поскольку вы хотите вернуть только один результат. Если запись не найдена, возвращается null. Если вы строите этот запрос из класса Eloquent, вы можете использовать self, например $userRecord = self::where('email', $email)->where('password', $password)->first();

Подробнее здесь

Ответ 5

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

или

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

I` подумайте, что это условие лучше, чем 2 где. это где условие array в массиве где условия;

Ответ 6

После тщательного тестирования я узнал, что источником моей проблемы является Hash:: make ('password'). По-видимому, это все время создавало другой хеш. Я заменил это своей собственной функцией хеширования (ранее писал в кодеигнитре) и альтом! все хорошо работало.

Еще раз спасибо за помощь:) Очень ценю это!