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 相关文章推荐
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
php加密解密实用类分享
Jan 07 PHP
PHP 错误处理机制
Jul 06 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
PHP实现json_decode不转义中文的方法
May 20 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
php仿discuz分页效果代码
2008/10/02 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
JavaScript中String对象的方法介绍
2017/01/04 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
js计时事件实现圆形时钟
2020/03/25 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
python文件操作之目录遍历实例分析
2015/05/20 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
两年的个人工作自我评价
2014/01/10 职场文书
聚美优品的广告词
2014/03/14 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python