Как правильно вставить время, когда пользователь уходит (user_left и user_joined получили одинаковое значение) - PullRequest
2 голосов
/ 27 сентября 2019

В этом коде я хотел бы получить время, когда пользователь присоединился и ушел, и сохранить его в БД.Что происходит, когда я получаю одинаковое значение как в «соединенных», так и в «левых» таблицах.Как это исправить, чтобы в нем хранились разные значения?

 Schema::create('user_info', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('ip');
        $table->string('joined');
        $table->string('left');
    });

в LoginController

public function logout() {
    $left = now();
    auth()->logout();
    session()->forget('name');
    session()->put('left',  $left);
    return redirect('/');
}

в модели

protected $fillable = ['ip','name', 'joined'];
const CREATED_AT = 'joined';
const UPDATED_AT = 'left';

public static function storeUser() { 
  UserInfo::create([
    'ip' => Request::ip(),
    'name' =>  Auth::user()->name, 
    'joined' => now(),   
 ]);  
} 

BroadcastServiceProvider.php

Broadcast::channel('chat', function ($user) {
        $ip = Request::ip();
        $time = now(); 
        if (auth()->check() && !session()->has('name'))  { 
            UserInfo::storeUser();
            session()->put('name',$user->name);
            return [
                'id' => $user->id,
                'ip' => $ip,
                'name' => $user->name,
                'joined' => $time,
            ];
        }
    });

Это изображение иллюстрирует поведение после некоторых изменений, которые вы увидите ниже.Это показывает, что данные с ключом 'left' на данный момент идут не предполагаемому пользователю, а первому пользователю с таким именем.

This strange behaviour Продолжение этого вопроса здесь Как переопределить этот код, чтобы он правильно вставлял данные?

1 Ответ

2 голосов
/ 27 сентября 2019

CREATED_AT и UPDATED_AT - это отметки времени, которые изменяются моделью Eloquent, когда модель создается, она также модифицируется или updated с несуществующего на существующее, поэтому вы получаете одно и то же значение * 1004.*

В функции выхода из системы обновите столбец left пользователя

public function logout() {
    $user_id = auth()->id(); // Get authenticated user ID
    $user_info = App\UserInfo::find($user_id); // Get user info
    $user_info->left = now(); // Change here
    $user_info->save(); // Update here
    auth()->logout();
    session()->forget('name');
    session()->put('left',  $left);
    return redirect('/');
}

В соответствии с вашей таблицей, нет никакого способа отличить пользователей от их информации, поскольку имя не уникально

Создайте user_id основанное отношение

User модель

public function info()
{
    return $this->hasOne(UserInfo::class);
}

UserInfo модель

public function user()
{
    return $this->belongsTo(User::class);
}

И в user_infos миграции

Schema::create('user_infos', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->string('name');
    $table->string('ip');
    $table->dateTime('joined');
    $table->dateTime('left');
});

Метод очистки

public function logout() {
    $info = auth()->user()->info; // Get user info
    $info->left = now(); // Change here
    $info->save(); // Update here
    auth()->logout();
    session()->forget('name');
    session()->put('left',  $left);
    return redirect('/');
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...