Упростить логику подсчета (не отвеченых сообщений, подсчет cnt)

105
09 января 2022, 15:40

Столкнулся с следующей проблемой, на сайте есть служба поддержки, где ведется переписка с пользователем и админом. Появилась проблема, что вся админка стала очень долго грузиться, была выявлена причина, долгую загрузку давал метод подсчета (количества не отвеченных сообщений), а так как он отображается на любой странице в админке, то любая страница начала грузиться более 5 секунд.

Ниже приведу кусок кода с модели и контроллера, что бы увидеть общую картину:

Контроллер:

function getCount()
{
    $cnt = model_support::getUnreadAdmin();
    if($cnt > 0)
    {
        echo '<span class="">'.$cnt.'</span>';
    }
}

Модель: (есть два варианта подсчета, но один из них работает быстрее но считает не совсем верно, он будет подписан как "вариант 2")

Вариант1

public static function getUnreadAdmin()
{
    $list = self::getAdminList();
    $cnt = 0;
    foreach($list as $k)
    {
        $last = $k->getLastMessage();
        if($last['author_type'] == 'user' and !$last['admin_readed'])
            $cnt++;
    }
    return $cnt;
}

Вариант 2

public static function getUnreadAdmin()
{
    $stmt = database::query("SELECT COUNT(id) AS cnt FROM (SELECT * FROM (SELECT * FROM support  ORDER BY created_at DESC) s  GROUP BY user_id) ss  WHERE admin_readed=0 AND author_type='user'");
    $stmt->execute();
    return $stmt->fetch(PDO::FETCH_ASSOC)['cnt'];
}

В первом варианте в метод вызывается getAdminList() Вот эта функция:

public static function getAdminList()
{
    $list = database::i()->support()->order('created_at DESC')
            ->select('support.*, COUNT(support.id) as cnt')
            ->group('user_id')
            // ->order('created_at DESC')->limit(10)
            ->order('created_at DESC')
            ->fetchPairs('id');
    uasort($list, function($a, $b){
        // return ($a->getLastMessage()['author_type'] == 'user') ? -1 : 1;
        return ($a->getLastMessage()['created_at'] > $b->getLastMessage()['created_at']) ? -1 : 1;
    });
    // $stmt = database::query("SELECT *, COUNT(id) AS cnt FROM (SELECT * FROM support  ORDER BY created_at DESC) s  GROUP BY user_id order by created_at desc");
    // $list = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $list;
}

Буду рад помощи в этой ситуации, а так же предложению как это еще можно делать. Спасибо!

READ ALSO
Вывести последнюю запись

Вывести последнюю запись

Есть 3 таблицы: users

75
onClick функция в EJS

onClick функция в EJS

Возникла проблема вызова функции по хэндлеру onClick в ejs из get запросаФункция должна лежать на сервере ибо будут выполнятся операции с бд и т

111