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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
PHP_MySQL教程-第一天
Mar 18 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
基于PHP静态类的原罪详解
May 06 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
php去除头尾空格的2种方法
Mar 16 PHP
PHP中实现crontab代码分享
Mar 26 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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 随机数的深入理解
2013/06/05 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
angularJs的ng-class切换class
2017/06/23 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python绘制直线的方法
2018/06/30 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
详解Python做一个名片管理系统
2019/03/14 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
交通安全寄语大全
2014/04/08 职场文书
优秀会计求职信
2014/07/04 职场文书
2014年手术室工作总结
2014/11/26 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript