首页 > Web开发 > 详细

[ThinkPHP]延迟更新方法的陷阱

时间:2014-08-08 18:35:36      阅读:523      评论:0      收藏:0      [点我收藏+]
[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:将延迟更新操作放到自定义模型类方法里面,并在方法最后加上同样的代码。

[ThinkPHP]延迟更新方法的陷阱,布布扣,bubuko.com

[ThinkPHP]延迟更新方法的陷阱

原文:http://my.oschina.net/cxz001/blog/299376

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!