Yii使用DeleteAll连表删除出现报错问题的解决方法


Posted in PHP onJuly 14, 2016

本文实例讲述了Yii使用DeleteAll连表删除出现报错问题的解决方法。分享给大家供大家参考,具体如下:

删除数据的时候,经常会遇到连联判断删除数据的条件,今天用Yii 的CDbCriteria生成关连条件。批量删除的时候数据库报错。

页面代码为:

$criteria=new CDbCriteria;
$criteria->join = ' LEFT JOIN {{positions}} p ON p.zpo_id=t.zpo_id ';
$criteria->addCondition("p.zpo_type=1");
$criteria->addCondition("t.zpl_content_id in ($id)");
PosLog::model()->deleteAll($criteria);

错误SQL为:

DELETE FROM `zd_pos_log` LEFT JOIN zd_positions p ON p.zpo_id=t.zpo_id WHERE (p.zpo_type=1) AND (t.zpl_content_id in (76))

正确SQL语句应为:

DELETE t FROM `zd_pos_log` t LEFT JOIN zd_positions p ON p.zpo_id=t.zpo_id WHERE (p.zpo_type=1) AND (t.zpl_content_id in (76))

追溯到Yii 基类:

framework/db/schema/CDbCommandBuilder.php#166

public function createDeleteCommand($table,$criteria)
{
  $this->ensureTable($table);
  $sql="DELETE FROM {$table->rawName}";
  $sql=$this->applyJoin($sql,$criteria->join);
  $sql=$this->applyCondition($sql,$criteria->condition);
  $sql=$this->applyGroup($sql,$criteria->group);
  $sql=$this->applyHaving($sql,$criteria->having);
  $sql=$this->applyOrder($sql,$criteria->order);
  $sql=$this->applyLimit($sql,$criteria->limit,$criteria->offset);
  $command=$this->_connection->createCommand($sql);
  $this->bindValues($command,$criteria->params);
  return $command;
}

解决方案。修改基类方法:

public function createDeleteCommand($table,$criteria,$alias='t')
{
  $this->ensureTable($table);
  $alias=$this->_schema->quoteTableName($alias);
  if(empty($criteria->join)){
    $sql="DELETE FROM {$table->rawName}";
  }else{
    $sql="DELETE $alias FROM {$table->rawName} $alias";
  }
  $sql=$this->applyJoin($sql,$criteria->join);
  $sql=$this->applyCondition($sql,$criteria->condition);
  $sql=$this->applyGroup($sql,$criteria->group);
  $sql=$this->applyHaving($sql,$criteria->having);
  $sql=$this->applyOrder($sql,$criteria->order);
  $sql=$this->applyLimit($sql,$criteria->limit,$criteria->offset);
  $command=$this->_connection->createCommand($sql);
  $this->bindValues($command,$criteria->params);
  return $command;
}

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
example1.php
Oct 09 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
PHP实现类似题库抽题效果
Aug 16 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
Jul 14 #PHP
Yii实现的多级联动下拉菜单
Jul 13 #PHP
YII视图整合kindeditor扩展的方法
Jul 13 #PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 #PHP
Yii安装与使用Excel扩展的方法
Jul 13 #PHP
Yii配置与使用memcached缓存的方法
Jul 13 #PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 #PHP
You might like
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
python装饰器与递归算法详解
2016/02/18 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python3学生名片管理v2.0版
2018/11/29 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
停电调休通知
2015/04/16 职场文书
电频谱管理的原则是什么
2022/02/18 无线电
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL