首页 > 代码库 > [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:将延迟更新操作放到自定义模型类方法里面,并在方法最后加上同样的代码。
$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:将延迟更新操作放到自定义模型类方法里面,并在方法最后加上同样的代码。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。