我目前正在开发一个PHP(laravel)项目,我们正在使用MongoDB(jenssegers包)。我将密码重置为以下结构:
{
"_id" : ObjectId("58d56135b462e816642abbd1"),
"email" : "wesley@foo.bar",
"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
。所以,当我想搜索令牌时,我希望能够搜索所有重置而不是这样做:
$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?
感谢。
答案 0 :(得分:1)
如果您使用EmbedsMany关系,则可以获得至少拥有1个匹配令牌的所有用户:
User::where('passwordReset', 'elemMatch', array('token' => $this->route('token')));