В настоящее время я работаю над проектом PHP (laravel), где мы используем MongoDB (пакет jenssegers). Я сделал сброс пароля на следующую структуру:
{
"_id" : ObjectId("58d56135b462e816642abbd1"),
"email" : "[email protected]",
"updated_at" : ISODate("2017-03-26T20:46:14.074Z"),
"created_at" : ISODate("2017-03-24T18:11:01.040Z"),
"passwordReset" : [
{
"token" : "59b4b694e9ddcd9b44b0374eac595b28",
"updated_at" : ISODate("2017-03-24T18:11:05.017Z"),
"created_at" : ISODate("2017-03-24T18:11:05.017Z"),
"_id" : ObjectId("58d56139b462e816642abbd4")
}
]
}
Тем не менее, несколько пользователей могут иметь несколько passwordReset
«S. Поэтому, когда я хочу искать токены, я хотел бы просто иметь возможность искать все сбросы вместо того, чтобы делать это:
$users = User::all();
$activeReset = null;
foreach ($users as $user) {
if (! is_null($user->passwordReset)) {
foreach ($user->passwordReset as $reset) {
if ($reset->token == $this->route('token')) {
$activeReset = $reset;
}
}
}
}
Это рабочее решение, но оно не самое красивое, также, когда приложение запускается в производство, это приведет к огромному времени загрузки, а это не то, что я ищу.
Тем не менее, просто все сбрасывает через PasswordReset::all();
приводит к пустому массиву.
Итак, есть ли способ сделать это, не проходя через всех пользователей? Через Laravel
сам или может через «сырой» PHP?
Благодарю.
Вы можете получить всех пользователей, у которых есть хотя бы один соответствующий токен, если вы используете EmbedsMany отношение:
User::where('passwordReset', 'elemMatch', array('token' => $this->route('token')));
Других решений пока нет …