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 相关文章推荐
PHP4之真OO
Oct 09 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
php生成随机密码的几种方法
Jan 17 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
php构造函数实例讲解
Nov 13 PHP
php自定义函数截取汉字长度
May 15 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php防止sql注入代码实例
2013/12/18 PHP
详解php中 === 的使用
2016/10/24 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
Angular实现响应式表单
2017/08/04 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
angular2中使用第三方js库的实例
2018/02/26 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python中实现字符串翻转的方法
2018/07/11 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
精彩的大学生自我评价
2013/11/17 职场文书
给交警的表扬信
2014/01/12 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
会议主持词
2014/03/17 职场文书
股东合作协议书
2014/09/12 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android