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'). По-видимому, это все время создавало другой хеш. Я заменил это своей собственной функцией хеширования (ранее писал в кодеигнитре) и альтом! все хорошо работало.
Еще раз спасибо за помощь:) Очень ценю это!