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
基于mysql的bbs设计(一)
Oct 09 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
PHP实现验证码校验功能
Nov 16 PHP
php校验公钥是否可用的实例方法
Sep 17 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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
Terran兵种对照表
2020/03/14 星际争霸
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
jQuery的12招常用技巧分享
2011/08/08 Javascript
Web开发之JavaScript
2012/03/29 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
python提示No module named images的解决方法
2014/09/29 Python
Python切片知识解析
2016/03/06 Python
Python3使用requests发闪存的方法
2016/05/11 Python
python 队列详解及实例代码
2016/10/18 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
运动会闭幕式解说词
2014/02/21 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
功夫熊猫观后感
2015/06/10 职场文书
2019入党申请书格式
2019/06/25 职场文书
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
DSP接收机前端设想
2022/04/05 无线电
Python Flask实现进度条
2022/05/11 Python