如何更新记录时避免自动关联对应的belongsTo关联表?
解决CakePHP updateAll自动添加关联表的问题
看起来你在使用CakePHP的updateAll方法时遇到了头疼的问题——明明只想单独更新items表的特定记录,结果生成的SQL里自动带上了item_favorites、categories这些关联表的连接。这其实是因为你的Item模型里定义了关联关系(比如belongsTo Category、hasMany ItemFavorite),而CakePHP的ORM默认会根据模型的recursive属性自动加载关联表,导致update操作被额外的连接绑定了。
下面给你几个实用的解决办法:
临时关闭模型递归属性:
在调用updateAll前,把Item模型的recursive设为-1,这样ORM就不会自动加载任何关联表了:$this->Item->recursive = -1; $this->Item->updateAll( array('Item.alg_update' => 0), array('Item.id' => 123456) );用Containable行为清空关联:
如果你的模型启用了Containable行为,可以通过contain()方法明确指定不加载任何关联,精准控制查询范围:$this->Item->contain(); // 不加载任何关联表 $this->Item->updateAll( array('Item.alg_update' => 0), array('Item.id' => 123456) );直接执行原生SQL:
如果上面的方法都不生效,你可以绕过ORM,直接用query方法执行原生UPDATE语句,完全掌控查询内容:$this->Item->query("UPDATE `items` SET `alg_update` = 0 WHERE `id` = 123456");检查模型关联配置:
另外也可以排查下Item模型里的关联定义,确认是否有不必要的with属性或强制关联的设置,但一般来说前面的临时设置方法就足够解决问题了。
需要注意的是,recursive和Containable的设置都是临时的,只会影响当前请求中的这个操作,不会改变模型的全局配置,不用担心影响其他地方的关联查询。
内容的提问来源于stack exchange,提问作者Neel Goswami
相关产品推荐
相关产品推荐

