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 在线打包_支持子目录
Jun 28 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
关于js与php互相传值的介绍
Jun 25 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
thinkphp自带验证码全面解析
Sep 18 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PDO::lastInsertId讲解
Jan 29 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 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 无限级 SelectTree 类
2009/05/19 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php扩展开发入门demo示例
2019/09/23 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
微信JS接口大全
2016/08/25 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
django 2.0更新的10条注意事项总结
2018/01/05 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
护士自我评价
2014/02/01 职场文书
超市重阳节活动方案
2014/02/10 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
三年级小学生评语
2014/04/22 职场文书
拓展策划方案
2014/06/03 职场文书
关于分班的感言
2015/08/04 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Python中第三方库Faker的使用详解
2022/04/02 Python
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python