@sprashivatel

Как избежать дублей при сохранении в БД?

Контроллер приложения
<?php


namespace app\controllers;


use app\models\User;
use core\base\Controller;

abstract class AppController extends Controller
{
    protected $user;

    public function __construct($route)
    {
        parent::__construct($route);
        $this->user = User::getUser();
        $this->extra_vars['user'] = $this->user; // $user доступна в видах и шаблонах всегда
    }
}

Моделька
<?php


namespace app\models;


use core\base\Model;

class User extends Model
{
    protected static function table()
    {
        return 'user';
    }

    public static function getUser()
    {
        if (isset($_SESSION['id_token'])) {
            [$id, $token] = explode(':', $_SESSION['id_token'], 2);
            $user = self::findOneById($id);
            if ($user and $user->token == $token) {
                return $user;
            }
            unset($_SESSION['id_token']);
        }
        return null;
    }

    public function getHp()
    {
        $this->hp -= 1; // для теста
        $this->save();
        return $this->hp;
    }

    public function getMp()
    {
        $this->mp -= 5; // для теста
        $this->save();
        return $this->mp;
    }
}

Кусок вида
<div class="col-4 text-danger p-0">
    <i class="fas fa-heartbeat"></i> <span id="hp"><?= (int)$user->getHp() ?></span>
</div>
<div class="col-4 border-left border-right text-primary p-0">
    <i class="fas fa-bolt"></i> <span id="mp"><?= (int)$user->getMp() ?></span>
</div>

Суть: нужно во время забора этих двух параметров произвести с ними ещё И некоторые действия (восстановление - регенерация, в зависимости от прошедшего времени, может произойти апдейт, а может и не произойти в зависимости от наступившего условия).

Выхлоп:

1. select * from user where id = ?
2. update user set hp = ? where id = 1 // getHp()
3. update user set hp = ?, mp = ? where id = 1 // getMp()


Как видим, в запросах 2 и 3 происходит дубль записи hp = ? )))

Если честно не могу сообразить, как пофиксить траблу такую, может кто-то подскажет направление?

p.s. для апдейта параметры собираются в базовой модели Model в отдельный массив, что ли массив этот очищать перед-после апдейта каждого?
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ybulankin
Не понимаю, зачем в getHp и getMp ты делаешь save()?
По логике, эти функции должны только отдавать hp и mp.
Делай save в другой функции, когда эти значения меняются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
DANYCOM Краснодар
от 50 000 до 100 000 ₽
ЭР-Телеком Пермь
от 80 000 ₽
ЧИТАЙ-ГОРОД Москва
от 140 000 до 210 000 ₽