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

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

时间: 2024-09-29 23:30:35

[ThinkPHP]延迟更新方法的陷阱的相关文章

angular 延迟更新方法

失去焦点后更新: <input ng-model="name" ng-model-options="{updateOn:'blur'}" />{{name}} 设置时间后更新 <input ng-model="name" ng-model-options="{debounce:'1000'}" />{{name}} 结合前两种情况都同时实现 ,即在指定时间后更新,如果还有没时间,这时失去焦点也可以达到更

thinkphp中limit方法

limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足要求的10个用户,如下调用即可: $User = M('User');$User->where('status=1')->field('id,name')->limit(10)->select(); limit方法也可以用于写操作,例如更新满足要求的3条数据: $User = M('U

Android SDK离线安装更新方法

直接使用Android SDK Manager进行下载.更新速度很慢,有时候会出现错误.网上查找了不少网友的方法,做个总结. 1.启动Android SDK Manager,并等待reposity加载完成. 2.点击右下角图标,显示Android SDK Manager Log,内容如下: Fetching http://dl-ssl.google.com/android/repository/addons_list-2.xml Fetched Add-ons List successfully

[其他]Android SDK离线文件路径以及安装更新方法

一.离线安装Android SDK文件路径 转载自:http://www.oschina.net/code/snippet_1539302_45940 Google TV Addon, Android API13, revision 1 https://dl-ssl.google.com/android/repository/google_tv-13_r01.zip Android SDK Platform-tools,revision 21 [*] http://dl-ssl.google.c

序列模式--更新方法

理论要点 什么是更新方法模式:通过每次处理一帧的行为模拟一系列独立对象.通俗地讲就是每帧更新游戏中我们看到的所有对象的方法(npc,monster,player-). 要点 1,更新方法模式:在游戏中保持游戏对象的集合.每个对象实现一个更新方法,以处理对象在一帧内的行为.每一帧中,游戏循环对集合中的每一个对象进行更新. 2,当离开每帧时,我们也许需要存储下状态,以备不时之需. 使用场合 在游戏中,更新方法和游戏循环模式一般一起使用.更新方法适应以下情况: 1,游戏中有很多对象或系统需要同时运行.

Extjs4 RowEditing 的使用和更新方法

Extjs4 RowEditing 的使用和更新方法 2013-09-05 16:29 11026人阅读 评论(0) 收藏 举报  分类: Extjs(49)  版权声明:本文为博主原创文章,未经博主允许不得转载. 如何灵活快速的掌握RowEditing组件的应用,应大家的要求,今天给大家具体讲下该组件的使用. 1.创建 var rowEditing = Ext.create('Ext.grid.plugin.RowEditing',{            pluginId:'rowEditi

数据库分表和分库的原理及基于thinkPHP的实现方法

为什么要分表,分库: 当我们的数据表数据量,访问量很大,或者是使用频繁的时候,一个数据表已经不能承受如此大的数据访问和存储,所以,为了减轻数据库的负担,加快数据的存储,就需要将一张表分成多张,及将一类数据存入不同的几张表,当分表已经不能满足需求是,我们还可以分库,及用几个数据库存储. 分表会随着需求和功能的不同有不同的实现方法,下面是我做项目中的一个例子: 需求:product,product_price两张表是一对多的关系,及产品和产品每日的价格,一个产品对应几种价格,现在由于产品表数据量很大

ThinkPHP中F方法快速缓存实例

一般使用文件方式的缓存就能够满足要求,而thinkPHP还提供了一个专门用于文件方式的快速缓存方法F方法. 由于采用的是PHP返回方式,所以其效率较S方法较高.F方法具有如下特点:1.简单数据缓存:2.文件形式保存:3.采用PHP返回数据方式加载缓存:4.支持子目录缓存以及自动创建:5.支持删除缓存和批量删除:$path="../Public/Runtime/";$str="fastrunaaaaaaaaaaaaaaaa";F("str/ffun"

hdu 5023 线段树延迟更新+状态压缩

/* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N*4]; int lower[31]; void build(int t,int x,int y) { a[t].x=x; a[t].y=y; a[t].yanchi=0; if(x==y){ a[t].sum=lower[1]; return ; } int temp=t<<1; int mid=