thinkphp中编辑时使用cache的一些注意坑点

发布时间:2024-05-08浏览次数:185 次
thinkphp中编辑时使用cache的一些注意坑点

在做系统日志的时候,我想要对比编辑前和编辑后的数据,存在的差异性的时候,发现一些问题。在此记录一下:

$info = User::find(1);
$data = [
    'id' => 1,
    'username' => 'zhangsan' . rand(0, 999),
    'create_time' => time()
];
$info->cache('user')->data($data)->save();

print_r($info->getData());
echo "<hr />";
print_r($data); // // $info与$data相同

上述代码中,打印出的$info和$data数据是一致的,因此如果要获取编辑前后的差异,就需要在执行save编辑之前进行获取。但是我发现,我之前的项目中,在最后一部获取也是没问题的(使用了cache),做了些测试,发现如下一些问题,简单记录一下:

在thinkphp中,官方推荐编辑数据的方式是先查询,然后修改,如下代码:

$info = User::find(1);
$data = [

    'username' => 'zhangsan' . rand(0, 999),
    'create_time' => time()
];
$res = $info->data($data)->save();

在实际项目中,我们也一般都是这样处理的,但是当我们使用了数据缓存的方式时,会出现一些小小的坑点,需要注意一下,如下代码:

$info = User::find(1);
$data = [

    'username' => 'zhangsan' . rand(0, 999),
    'create_time' => time()
];
$res = $info->cache('user')->data($data)->save();

执行上述代码,实现的效果将不再是更新,而是新增,这个有点略微的和常识不符,但是在项目中,也是这样写的,却是可以正常编辑的,查看原因,发现问题出在项目中表单提交的data数据中,都添加了id属性,即,如下代码,可以正常执行编辑:

$info = User::find(1);
$data = [
    'id' => 1, // 存在id数据项
    'username' => 'zhangsan' . rand(0, 999),
    'create_time' => time()
];
$res = $info->cache('user')->data($data)->save();

print_r($info->getData());
echo "<hr />";
print_r($data); // $info与$data不同

综合上述代码,可以得出如下几个结论:

1、不使用cache的情况下,打印编辑前后的数据,数据一致;在使用cache的情况下,打印编辑前后的数据,数据是不相同的。因此,妥善期间,获取数据之间的差异,需要在执行编辑操作之前进行。

2、不使用cache的情况下,$info->save($data)执行的是编辑,而在使用了cache的情况下,当数据中不存在id项时,$info->save($data)执行的是新增,存在id数据项时,$info->save($data)执行的是编辑操作。

扫一扫,在手机上查看