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 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
PHP中的正规表达式(二)
Oct 09 PHP
mysql中存储过程、函数的一些问题
Feb 14 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
PHP生成压缩文件实例
Feb 07 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 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
Zerg剧情介绍
2020/03/14 星际争霸
PHP新手上路(十)
2006/10/09 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python局部赋值的规则
2013/03/07 Python
详解Python的Django框架中的templates设置
2015/05/11 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
Python for循环生成列表的实例
2018/06/15 Python
TensorFlow实现模型评估
2018/09/07 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
业务员岗位职责
2013/11/16 职场文书
车间调度岗位职责
2013/11/30 职场文书
办公室经理岗位职责
2014/01/01 职场文书
全陪导游欢迎词
2014/01/17 职场文书
护士辞职信模板
2014/01/20 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL