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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
杏林同学录(八)
Oct 09 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
PHP反射API示例分享
Oct 08 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
PHP实现页面静态化深入讲解
Mar 04 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
mac下安装nginx和php
2013/11/04 PHP
php中switch语句用法详解
2015/08/17 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
phpfpm的作用和用法
2019/10/10 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
python实现网站的模拟登录
2016/01/04 Python
Python运算符重载详解及实例代码
2017/03/07 Python
带你认识Django
2019/01/15 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
党支部书记先进事迹
2014/01/17 职场文书
公务员转正考察材料
2014/02/07 职场文书
教师产假请假条范文
2014/04/10 职场文书
2014组织生活会方案
2014/05/19 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
担保书格式
2015/01/20 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技