ThinkPHP7中查用户积分记录需手动补全登录态和表结构,首页控制器用Db::name()查user_point_log表并校验session('user_id'),模板用volist安全展示,注意索引、分页与缓存优化。

ThinkPHP7里怎么查用户积分记录
直接用 Db 或模型查就行,但要注意 TP7 默认不带「用户登录态」和「积分表结构」,得自己补全逻辑。别指望 think-auth 或旧版插件能开箱即用。
首页控制器里怎么写查询逻辑
假设你已在登录后把用户 ID 存在 session('user_id'),积分记录存在 user_point_log 表(字段含 user_id、point、type、created_at),那首页控制器(比如 IndexController)里可以这样写:
// app/controller/IndexController.php
use think\facade\Db;
public function index()
{
$userId = session('user_id');
if (!$userId) {
$this->redirect('/login');
}
$logs = Db::name('user_point_log')
->where('user_id', $userId)
->order('created_at DESC')
->limit(10)
->select();
return view('index', ['point_logs' => $logs]);
}
- 别漏掉
session('user_id')校验,TP7 不自动绑定用户上下文 -
Db::name()比Db::table()更安全,避免 SQL 注入风险 - 如果用了模型(如
UserPointLog),记得在模型里定义protected $table = 'user_point_log';,否则会默认找复数表名
模板里怎么安全展示积分变动
在 view/index.html 里遍历时,注意 point 可能为负(扣分),type 是数字编码(比如 1=签到、2=评论、3=退款),别直接 echo 数字:
{volist name="point_logs" id="log"}
<div class="log-item">
<span>{$log.point|number_format}</span>
<span>{switch name="log.type"}
{case value="1"}每日签到{/case}
{case value="2"}发表评论{/case}
{case value="3"}订单退款{/case}
{default}系统调整{/default}
{/switch}</span>
<span>{$log.created_at|date='Y-m-d H:i'}</span>
</div>
{/volist}
-
number_format防止小数点后一长串零(比如 100.0000) - 模板里别调用
Db::或数据库操作,TP7 的模板引擎不支持复杂查询 - 如果
created_at是时间戳,用|date='Y-m-d H:i:s';如果是 datetime 类型,直接用|date就行
为什么首页加载慢?几个关键排查点
积分记录一多,首页就卡,常见原因不是代码写错,而是没加索引或没限制数据量:
-
user_point_log表必须给user_id加普通索引,不然WHERE user_id = ?会全表扫描 - 别在首页查全部记录,
limit 10是底线;真要翻页,用paginate()而不是select() - 如果积分变动频繁(比如每秒几十条),考虑加缓存:查完后用
cache('user_'.$userId.'_points', $logs, 300)存 5 分钟 - TP7 的
Db默认不开启查询日志,调试时可临时加Db::listen(function ($sql, $time, $explain) { dump($sql); });
真正麻烦的不是怎么查,而是「谁改了积分」「改完要不要发消息」「并发扣分有没有超支校验」——这些业务逻辑 TP7 不管,得你自己在 service 层兜住。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











