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脚本的10个技巧(7)
Oct 09 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
php处理restful请求的路由类分享
Feb 27 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
再论Javascript下字符串连接的性能
2011/03/05 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python概率计算器实例分析
2015/03/25 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
水产养殖学应届生求职信
2013/09/29 职场文书
监理员的岗位职责
2013/11/13 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
会议活动邀请函
2014/01/27 职场文书
学习礼仪心得体会
2014/09/01 职场文书
业务内勤岗位职责
2015/04/13 职场文书
家庭经济困难证明
2015/06/23 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
MySQL索引失效场景及解决方案
2022/07/23 MySQL