首页 > 代码库 > [ThinkPHP]延迟更新方法的陷阱

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

[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:将延迟更新操作放到自定义模型类方法里面,并在方法最后加上同样的代码。