Yii使用DeleteAll连表删除出现报错问题的解决方法

 更新时间:2016年07月14日 09:48:41   作者:dreamzml  
这篇文章主要介绍了Yii使用DeleteAll连表删除出现报错问题的解决方法,分析了相关的SQL语句及出现错误的原因与改正方法,需要的朋友可以参考下

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

相关文章

  • Laravel框架路由与MVC实例详解

    Laravel框架路由与MVC实例详解

    这篇文章主要介绍了Laravel框架路由与MVC,结合实例形式详细分析了laravel框架路由、MVC的模型、视图、控制器相关概念、原理及使用技巧,需要的朋友可以参考下
    2020-01-01
  • thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例

    thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返

    这篇文章主要介绍了thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json操作,结合实例形式分析了thinkphp5 + ajax 使用formdata提交数据、文件上传与后台返回json遇到的相关问题即解决方法,需要的朋友可以参考下
    2020-03-03
  • Laravel框架Eloquent ORM新增数据、自定义时间戳及批量赋值用法详解

    Laravel框架Eloquent ORM新增数据、自定义时间戳及批量赋值用法详

    这篇文章主要介绍了Laravel框架Eloquent ORM新增数据、自定义时间戳及批量赋值用法,结合实例形式详细分析了Laravel框架Eloquent ORM通过模型新增数据、时间戳设置、批量赋值模型、Create新增等相关使用方法,需要的朋友可以参考下
    2019-12-12
  • thinkPHP框架中执行事务的方法示例

    thinkPHP框架中执行事务的方法示例

    这篇文章主要介绍了thinkPHP框架中执行事务的方法,结合实例形式分析了thinkPHP框架中使用模型中封装的startTran()、Commit()及Rollback()方法执行事务与回滚操作相关实现技巧,需要的朋友可以参考下
    2018-05-05
  • Yii中CGridView禁止列排序的设置方法

    Yii中CGridView禁止列排序的设置方法

    这篇文章主要介绍了Yii中CGridView禁止列排序的设置方法,讲述了CGridView的功能及通过数组项sortable设置实现禁止排列功能的方法,需要的朋友可以参考下
    2016-07-07
  • tp5.1 框架路由操作-URL生成实例分析

    tp5.1 框架路由操作-URL生成实例分析

    这篇文章主要介绍了tp5.1 框架路由操作-URL生成,结合实例形式分析了tp5.1 框架针对路由操作URL生成的相关实现原理、操作技巧与注意事项,需要的朋友可以参考下
    2020-05-05
  • PHP+jQuery+Ajax实现用户登录与退出

    PHP+jQuery+Ajax实现用户登录与退出

    本文使用Ajax无刷新登录和退出,从而提升了用户体验。 若用户为登录状态,则显示用户相关登录信息,否则显示登录表单。
    2015-04-04
  • CI框架安全过滤函数示例

    CI框架安全过滤函数示例

    这篇文章主要介绍了CI框架安全过滤函数,结合实例形式分析了CodeIgniter框架去空、防止XSS的函数定义与使用方法,并附带了原生PHP进行各种常见安全过滤相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • php上传图片存入数据库示例分享

    php上传图片存入数据库示例分享

    这篇文章主要介绍了php上传图片存入数据库示例,需要的朋友可以参考下
    2014-03-03
  • php实例分享之mysql数据备份

    php实例分享之mysql数据备份

    本代码实现了表结构和数据完全分开,默认有一个文件会记录所有表的结构,然后表中数据的备份 如果超过分卷的大小则会分成多个文件,不然则一个文件
    2014-05-05

最新评论