我正在编写以下代码以从Admin System注销特定用户。
我有会话表。 :I am following this link
$User = $this->Get($obj);
$UserSession = SessionModel::where('user_id', $obj->UserID)->first();
if($UserSession != null) {
$UserSession->user_id = null;
$UserSession->payload = null;
$UserSession->save();
}
这样做是否正确?
答案 0 :(得分:6)
你可以用一行代码清理它:
$deleted = SessionModel::whereUserId($obj->UserID)->delete();
// Returns the number of deleted sessions.
return $deleted;
删除属于用户的所有会话记录将使用户退出他们拥有的所有会话。
例如,如果用户在手机和计算机上登录您的应用程序,则会在两台设备上注销。
答案 1 :(得分:4)
$User = $this->Get($obj);
$UserSession = SessionModel::where('user_id', $obj->UserID)->first();
if($UserSession != null) {
$UserSession->user_id = null;
$UserSession->payload = null;
$UserSession->save();
}
您必须注意到,如果用户使用许多不同的浏览器登录,则用户可以拥有更多会话记录 =>解决方案:获取会话表中给定user_id的所有行并删除它们。使用有用的Collection方法
$User = $this->Get($obj);
// Get Collection Object
$UserSessions = SessionModel::where('user_id', $obj->UserID)->get();
if($UserSession != null) {
// Use each method on Collection Object
$UserSessions->each(function($UserSession){
$UserSession->delete();
});
}
答案 2 :(得分:-1)
您可能会认为会话表中的 user_id 应该可以为空,并且默认为空值,因为未登录的用户没有用户ID。然后您的迁移可能会有这一行。
$table->integer('user_id')->unsigned()->nullable()->default(null);
然后删除此表中特定用户的行将删除该用户会话。