热门标签数据通常存于tags表,含id、name、hit(或use_count/article_count)字段;hit须为数字型,查询需加status=1、hit>0、order('hit','desc')、limit(10)及缓存。

热门标签数据通常存在哪张表、用什么字段
ThinkPHP6.1 里没有内置“热门标签”模型,得自己建表。常见设计是 tags 表,至少含 id、name、hit(点击/使用次数)三个字段;有些项目用 use_count 或 article_count 替代 hit,本质一样——排序依据必须是数字型字段。
别直接查 Tag::all() 就完事,没排序、没限制数量、没排除禁用标签。真实场景下,还要加 status = 1 和 hit > 0 条件。
-
Tag模型需继承think\Model,且表名配置正确(如protected $table = 'tags';) - 若用软删除,记得调用
withTrashed()->where('deleted_at', null)或直接在查询中过滤 -
前端首页一般只取前 8~12 个,
limit(10)是合理起点
控制器里怎么查、怎么传给模板
别在模板里写 {$tagList|db:select='tags'} 这类魔术方法——TP6.1 已移除模板函数的数据库操作支持,强行用会报 Call to undefined function db() 错误。
正确做法是在控制器中完成查询,再 assign 给模板:
<?php // app/controller/Index.php
class Index extends BaseController
{
public function index()
{
$tagList = \app\model\Tag::where('status', 1)
->where('hit', '>', 0)
->order('hit', 'desc')
->limit(10)
->select();
$this->assign('tagList', $tagList);
return $this->fetch();
}
}
- 用
order('hit', 'desc')而不是order('hit DESC'),后者在某些版本会忽略排序 - 如果
hit字段是字符串类型(比如从日志拼出来的),必须先用cast或field显式转为 integer,否则排序失效 - 模板里用
{:dump($tagList)}快速验证数据是否拿到,避免白屏还瞎猜
模板里怎么安全渲染标签链接
前端首页渲染标签时,最常踩的坑是 URL 拼接错误和 XSS 风险。别写 @#@#@#@#@#@#@#@#@#@0 —— 中文标签会变乱码,空格、斜杠、单引号全可能炸掉路由。
必须用 url() 助手函数生成地址,并对输出做 HTML 实体转义:
{volist name="tagList" id="vo"}
<a href="%7B:url('tag/index',%20['name'%20=>%20%24vo['name']])%7D" title="{$vo.name|htmlspecialchars}">
{$vo.name|htmlspecialchars}
</a>
{/volist}
-
url('tag/index', ['name' => $vo['name']])会自动 URL 编码,比手拼更可靠 -
|htmlspecialchars必须加,尤其当name可能来自用户输入时 - 如果路由用了闭包或正则匹配,确认
name参数被正确捕获,否则点进去 404
性能和缓存怎么处理才不拖慢首页
热门标签更新不频繁,但首页 QPS 高,每次请求都查库等于主动给自己加压。TP6.1 的缓存门面可以直接套用:
$tagList = cache('hot_tags');
if (null === $tagList) {
$tagList = \app\model\Tag::where('status', 1)
->where('hit', '>', 0)
->order('hit', 'desc')
->limit(10)
->select();
cache('hot_tags', $tagList, 3600); // 缓存 1 小时
}
$this->assign('tagList', $tagList);
- 缓存键别用太泛的名字(如
tags),避免和其他模块冲突;加前缀如hot_tags更稳妥 - 如果后台修改了标签热度,记得在对应控制器里调用
cache('hot_tags', null)删除缓存 - Redis 缓存开启后,
cache()默认走 Redis;文件缓存慎用于高并发环境,容易锁文件
标签数据量不大,但漏掉缓存或缓存键写错,首页就成数据库放大器。上线前用 Xdebug 或日志确认 SQL 是否真被跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











