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
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
php生成随机数的三种方法
Sep 10 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php正则表达式学习笔记
Nov 13 PHP
php构造函数与析构函数
Apr 23 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP使用Redis长连接的方法详解
Feb 12 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 启动时报错的简单解决方法
2014/01/27 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
2014/08/19 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
php封装的验证码类分享
2017/02/26 PHP
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
js查错流程归纳
2012/05/04 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
Python多进程机制实例详解
2015/07/02 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python tcp传输代码实例解析
2020/03/18 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
医药专业推荐信
2013/11/15 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
初中家长寄语
2014/04/02 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
西安大雁塔导游词
2015/02/10 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书