thinkphp 的关联缓存通过模型配置自动生效,关联数据会跟随主模型缓存一起更新。具体做法是在模型中开启 `auto_write` 并设置 `cache` 属性为缓存键名,这样在调用 `save()` 或 `update()` 时,框架会自动清理该键对应的所有关联数据缓存。

如何配置模型的关联缓存
要在 ThinkPHP 中实现关联缓存,需要在模型类中定义 `cache` 属性。这个属性指定了该模型实例在缓存中的唯一标识。当启用自动写入(`auto_write = true`)时,任何对该模型数据的修改都会触发缓存清理逻辑,确保关联数据的实时性。

namespace app\model;
use think\Model;
class User extends Model {
// 开启自动写入,关联缓存才会生效
protected $autoWriteTimestamp = false;
protected $autoWrite = true;
// 设置缓存键名
protected $cache = 'user_info_';
// 定义关联:一个用户有多个订单
public function orders() {
return $this->hasMany(Order::class, 'user_id', 'id');
}
}
上述代码中,`$cache` 属性定义了缓存前缀。当调用 `$user->save($data)` 时,ThinkPHP 会自动识别出该模型有 `orders` 关联,并清理以 `user_info_` 开头的所有相关缓存条目。这避免了手动管理缓存键的复杂性。
关联查询时的缓存行为
在使用 `with()` 进行关联预加载时,缓存机制同样适用。如果主模型和关联模型都设置了 `cache` 属性,那么整个关联查询结果会被缓存为一个整体。这意味着后续相同的查询将直接从缓存中读取,而无需再次执行数据库操作。

// 获取用户及其订单
$user = User::with('orders')->find(1);
// 假设 User 和 Order 模型都配置了 cache 属性
// 第一次查询会存入缓存
// 第二次 find(1) 会直接返回缓存数据
// 修改用户信息
$user->name = 'New Name';
$user->save();
// 此时 user_info_1 及其关联的 order 缓存已被清理
// 下次查询 will 重新从数据库加载
这种机制确保了数据一致性。当主模型更新时,所有依赖它的关联缓存都会被自动清除。开发者无需担心脏数据问题,只需正确配置模型的 `cache` 属性即可。需要注意的是,如果关联模型没有设置缓存,则只有主模型缓存会被清理,关联数据仍会从数据库重新加载。
基于 save 方法的具体缓存清理过程
当调用模型的 `save()` 方法时,ThinkPHP 内部会执行一系列步骤来维护缓存状态。首先,它会检查模型是否配置了 `cache` 属性。如果配置了,它会根据当前模型的主键值构建完整的缓存键。接着,它会遍历模型定义的所有关联关系,找出所有可能受影响的关联缓存键。最后,它使用缓存驱动提供的删除方法,将这些键从缓存中移除。这个过程是原子性的,确保了数据的一致性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











