博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ThinkPHP]延迟更新方法的陷阱
阅读量:6721 次
发布时间:2019-06-25

本文共 819 字,大约阅读时间需要 2 分钟。

  hot3.png

[code]
$M = D('Article');
$M->where(array('id'=>1))->setLazyInc('click',1,600);//文章访问数量+1,延迟更新
$list = $M->where(array('status'=>0))->limit("0,10")->select();//读取文档列表
[/code]
这时候你打印$list,会发现只有一条记录。
将sql语句打印出来会发现:
[code]
select * from `tp_article` where `id`=1 AND  `status`=0 limit 0,10;
[/code]
延迟更新的条件被带入到下面的列表查询中去了!
tp模型有一个特性:在每次执行sql语句后会清空本次模型查询条件,也就是where() field()  order()等连贯操作所设置的值,这样就避免干扰下一个查询。
where()也有一个特性,同一个模型对象调用两次where(),条件会合并而不是覆盖,例如$M->where(array('id'=>1))->where(array('status'=>0))是相当于$M->where(array('id'=>1,'status'=>0))。
这两个特性恰恰给延迟更新功能埋下了一个陷阱。
延迟更新的时候设置了一个where条件,而由于采用了缓存延迟更新,导致并没有执行数据库操作,where条件被保留。接下来使用同一个模型进行查询操作,where条件被合并。
解决问题:
方法1:修改AdvModel类的,找到lazyWrite()方法,第一行插入一条代码
[code]$this->options=null;[/code]
方法2:将延迟更新操作放到自定义模型类方法里面,并在方法最后加上同样的代码。

转载于:https://my.oschina.net/cxz001/blog/299376

你可能感兴趣的文章
无聊的时候,冷死了
查看>>
chkconfig命令详解
查看>>
SharePoint环境变更系列
查看>>
深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
查看>>
BLE广播数据包分析
查看>>
Zabbix监控进程日志的配置过程
查看>>
amoeba for mysql
查看>>
Linux系统账号安全应用
查看>>
我的友情链接
查看>>
nginx 访问默认index.html首页跳转指定页面
查看>>
NFS在CentOS6.2下的安装与配置
查看>>
MySQLCluster部署配置文档
查看>>
第十四讲 while网络刷博器爬虫
查看>>
电子邮件系统组成的5部分
查看>>
ReadWriteLock用法
查看>>
JavaScript调试技巧之console.log()详解
查看>>
RHEL7.x解决SSH登录慢
查看>>
linux下如何删除大量小文件
查看>>
对于背板带宽和包转发率的解释
查看>>
Linux各类压宿包的解压方法
查看>>