欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php表設(shè)計(jì)實(shí)現(xiàn)短視頻評論區(qū)完整功能

 更新時(shí)間:2023年07月19日 14:13:57   作者:北橋蘇  
這篇文章主要為大家介紹了php表設(shè)計(jì)實(shí)現(xiàn)短視頻評論區(qū)完整功能示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

現(xiàn)如今,不管是哪種類型的應(yīng)用,評論區(qū)都少不了。從工具類的到媒體信息流類的,評論留言都是最基本的互動環(huán)節(jié)。比如抖音短視頻下,針對視頻每個(gè)用戶都可以發(fā)表自己的觀點(diǎn);而針對用戶的評論,其他的用戶又可以對其進(jìn)行評論,依次回復(fù)下去。       

那么,一個(gè)視頻的評論回復(fù)的表如何設(shè)計(jì)?功能如何實(shí)現(xiàn)呢?如標(biāo)題,這里是用一張表完成,但是在我完成功能后發(fā)現(xiàn)拆成兩個(gè)張更合適(評論表和回復(fù)表),這個(gè)后面已經(jīng)改了,最后也會說一下。

效果

頁面上展示是,視頻下分頁展示第一級的評論列表,評論下的評論是進(jìn)行折疊,點(diǎn)擊“查看全部”分頁顯示所有層級的評論。一張表的設(shè)計(jì)下,評論下的評論下……的評論是通過關(guān)聯(lián)上一級主鍵的,也就是遞歸的方式。

但是下面的是只要是對評論進(jìn)行評論都放在第一級的評論下,而遞歸是樹形結(jié)構(gòu)。雖然也能通過對樹形結(jié)構(gòu)數(shù)據(jù)處理拉伸到二季下,但是在底下評論特別多的情況就會體驗(yàn)特別差。所以針對這個(gè)我對表格加了一個(gè)面包屑字段,表結(jié)構(gòu)如下,然后再分次完成評論數(shù)據(jù)的如何添加,按頁面方式查詢的。

表結(jié)構(gòu)

CREATE TABLE `short_video_comment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) DEFAULT '0' COMMENT '父級ID',
  `crumbs` json DEFAULT NULL COMMENT '面包屑',
  `video_id` int(11) DEFAULT '0',
  `user_id` int(11) DEFAULT '0',
  `commented_user_id` int(11) DEFAULT '0' COMMENT '被評論者用戶ID',
  `is_pubisher` tinyint(1) DEFAULT '0' COMMENT '是否作者',
  `content` varchar(255) DEFAULT '' COMMENT '評論',
  `state` int(1) DEFAULT '1' COMMENT '1. 顯示  0. 隱藏',
  `like_count` int(11) DEFAULT '0' COMMENT '點(diǎn)贊數(shù)',
  `create_time` int(11) DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `delete_time` int(11) DEFAULT '0' COMMENT '刪除時(shí)間',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=282 DEFAULT CHARSET=utf8mb4 COMMENT='用戶評論記錄表';

如上圖的 “crumbs” 字段是一個(gè)數(shù)組方式的json,也就是添加時(shí)會記錄當(dāng)前評論的關(guān)系鏈,從最頂層ID到最近的上一級。而實(shí)現(xiàn)分頁顯示第二級下的所有評論,只需要把 “crumbs” 索引為1的pid作為查詢條件就能找到該id下的所有評論,如下是查詢二級評論ID為285的所有評論列表。

select * from short_video_comment where json_extract(crumbs, "$[1]") = 285

而對于關(guān)于crumbs如何存入和誰回復(fù)誰,就只需要在評論添加的時(shí)候,對上一級評論ID進(jìn)行遞歸查詢所有上級ID放入 "crumbs", 被回復(fù)者就更好辦了,查詢上一級評論的評論者ID(user_id),放入當(dāng)前評論記錄的 "commented_user_id",展示的時(shí)候只需要關(guān)聯(lián)一下用戶信息表就可以了,接下來就是業(yè)務(wù)代碼演示了。 

代碼演示

▲評論添加

public static function commentAdd($videoInfo, $userId, $content, $commentInfo = [])
{
    $commentId = 0;
    $videoId = $videoInfo['id'] ?? 0;
    $publisherId = $videoInfo['user_id'] ?? 0;
    try {
        $crumbs = [0];
        if ($commentInfo) {
            $pid = $commentInfo['id'] ?? 0;
            $insert['commented_user_id'] = $commentInfo['user_id'] ?? 0;
            $insert['pid'] = $pid;
            $crumbs = ShortVideoComment::getCrumbs($pid);
        }
        $insert['video_id'] = $videoId;
        $insert['user_id'] = $userId;
        $insert['is_pubisher'] = $userId == $publisherId ? 1 : 0;
        $insert['content'] = $content;
        $insert['state'] = ShortVideoComment::STATE['SHOW'];
        $insert['create_time'] = time();
        $insert['crumbs'] = json_encode($crumbs);
        $commentId = ShortVideoComment::insertGetId($insert);
        if ($commentId && $videoId) {
            $map[] = ['id', '=', $videoId];
            ShortVideoModel::where($map)->setInc('comment_count');
            $userId && self::setRating(6, $userId, $videoId);
        }
    } catch (\Exception $e) {
        $preFileName = str::snake(__FUNCTION__);
        $path = self::getClassName();
        write_log("msg:" . $e->getMessage(), $preFileName . "_error", $path);
    }
    return $commentId;
}

▲獲取面包屑

public static function getCrumbs($cateId = 0, &$ids = [])
{
    $idArr = array_merge((array)$cateId, $ids);
    $info = self::where('id', $cateId)->find();
    if ($info['pid'] != 0) {
        $idArr = self::getCrumbs($info['pid'], $idArr);
    } else {
        array_unshift($idArr, 0);
    }
    return $idArr;
}

▲數(shù)據(jù)查詢

public static function getList($map, $page = 1, $size = 30, $pid = 0)
{
    $where[] = ['delete_time', '=', 0];
    $where[] = ['state', '=', self::STATE['SHOW']];
    $map = array_merge($where, $map);
    $field = ['id,crumbs,pid,video_id,user_id,commented_user_id,content'];
    $queryObj = self::field($field)
        ->with([
            'user' => function ($query) {
                $query->withField('id, nickname, avatar, mobile');
            },
            'commented_user' => function ($query) {
                $query->withField('id, nickname, avatar, mobile');
            }
        ])
        ->where($map);
    $pid && $queryObj->whereRaw("JSON_EXTRACT(`crumbs` ,'$[1]') = $pid");
    $list = $queryObj->page($page, $size)
        ->order('like_count desc')
        ->select();
    return $list;
}

寫在最后

以上是初版時(shí)候根據(jù)業(yè)務(wù)設(shè)計(jì)的表格,后來的評論區(qū)完全仿照某音,所以也就對表格進(jìn)行了拆分。分成了評論表和回復(fù)表,只要是對評論進(jìn)行評論就是回復(fù),這樣在后面數(shù)據(jù)龐大的時(shí)候,性能會更好一點(diǎn)。但是如何是前期設(shè)計(jì)的就是一張表,而迭代的時(shí)候也要有某音評論的效果,可以作為解決方法嘗試滴,更多關(guān)于php短視頻評論區(qū)功能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論