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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • yii2.0之GridView自定义按钮和链接用法

    本文实例讲述了yii2.0之GridView自定义按钮和链接用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?= GridView::widget([         'dataProvider' => $dataProvider,         //'filterModel' => $searchModel,         'columns' => [             ['class' => 'yii\grid\SerialColumn'

  • Yii使用ajax验证显示错误messagebox的解决方法

    本文实例讲述了Yii使用ajax验证显示错误messagebox的解决方法.分享给大家供大家参考.具体方法如下: yii 自带了ajax 表单验证 这个可能有些朋友不知道了,但我今天在使用yii 自带的ajax 表单验证 时碰到一些问题,下面我来整理例子与大家参考一下. 在Yii中,可以利用ajax执行一个action,但是这个action有时候会有弹出错误讯息的需求,这时候的处理方式如下 基本思想 利用exception,比如: 复制代码 代码如下: throw new CHttpExcept

  • 在yii中新增一个用户验证的方法详解

    1.为什么要新增一个用户验证:因为我要将网站后台和前台做在同一个yii的应用中.但是前台也包含有会员的管理中心.而这两个用户验证是完全不同的,所以需要两个不同登陆页面,要将用户信息保存在不同的cookie或session中.所以需要在一个应用中增加一个用户验证2.yii的用户验证:在自定义用户验证前,我们首先要弄清楚yii的验证和授权方式.为了验证一个用户,我们需要定义一个有验证逻辑的验证类.在yii中这个类需要实现IUserIdentity接口,不同的类就可以实现不同的验证方 法.网站登陆一般

  • yiic命令时提示“php.exe”不是内部或外部命令的解决方法

    本文实例讲述了yiic命令时提示"php.exe"不是内部或外部命令的解决方法,分享给大家供大家参考.具体方法如下: 在CMD中运行 yiic webapp work 如果报"php.exe"不是内部命令,是这样的:原因是Yii自带的yiic.bat找不到php.exe. 解决方法: 因为没有加入环境变量,所以无法直接执行php.exe. 右击"我的电脑->属性->高级->环境变量->系统变量->PATH->编辑&quo

  • 浅析Yii中使用RBAC的完全指南(用户角色权限控制)

    写在前面    * 我的feed地址已经修改为: http://feeds.imdong.net ,请更新您的阅读器.    * 以下内容适合Yii 1.0.x,其他版本可能有略微的差别.    * 根据您的评论和反馈,本文会不断进行修改和补充,以方便新学习者.开始准备Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库在配置数组中,增加以下内容: 复制代码 代码如下: 'compon

  • Yii实现单用户博客系统文章详情页插入评论表单的方法

    本文实例讲述了Yii实现单用户博客系统文章详情页插入评论表单的方法.分享给大家供大家参考,具体如下: action部分: <?php function test($objs) { $objs->var=10; } class one { public $var=1; } $obj=new one(); echo $obj->var.'<p>'; test($obj); echo $obj->var; exit; PostController.php页面: ... /**

  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作. User::find()->all();    //返回所有用户数据: User::findOne($id);   //返回 主键 id=1  的一条数据: User::find()->where(['name' => 'ttt'])->one();   //返回 ['name' => 'ttt'] 的一条数据: User::find(

  • PHP的Yii框架使用中的一些错误解决方法与建议

    此文意在记录 Yii 开发过程中的小问题解决方案,不全面,不权威,不是教程.自己写过,觉得可以解决问题,以后也可能用上,就记记吧.     1. Yii 中 Js 和 Css 文件的引入.     我们就从最简单的问题开始吧,说起来也不是问题,只是语法罢了.假设我们的 js 文件都放在和 protected 同一层的 js 文件夹里,css 文件都放在和 protected 同一层的 css 文件夹里,好吧,规范就是这样的...那我们可以在对应的 view 界面按下面这样写,css 和 js 函

  • Yii2针对游客、用户防范规则和限制的解决方法分析

    本文实例分析了Yii2针对游客.用户防范规则和限制的解决方法.分享给大家供大家参考,具体如下: 最近在用Yii2.0做项目,其中需要实现一个功能:没有登录不能访问部分页面,即游客身份访问限制.查了半天资料,终于找到答案.解决方法如下: 在access里,access即访问的意思,其中有个配置项: 'only'=>['login','about'] 这是什么意思呢,意思是仅仅在login.about两个action内起作用,即当action 是login.about时,会进入rules里做下一步验

  • Yii2搭建后台并实现rbac权限控制完整实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到main-local.php就可以了,产品上线后,我们可以使用git或者svn忽略掉main-local.php,线上直接部署. 我们这里使用的mysql数据库,配置如下 当然啦,上面红圈圈的信息需要你自己手动修改掉,要是十分巧合跟我的一样

  • yii2.0实现验证用户名与邮箱功能

    本文为大家分享了yii2.0实现验证用户名与邮箱功能的相关代码,具体内容如下 视图signup.php代码: <?php use yii\helpers\Html; use yii\bootstrap\ActiveForm; /* @var $this yii\web\View */ /* @var $form yii\bootstrap\ActiveForm */ /* @var $model \frontend\models\SignupForm */ $this->title = '注册

  • yii用户注册表单验证实例

    本文实例讲述了yii用户注册表单验证实现方法.分享给大家供大家参考,具体如下: 视图层:register.php <?php //使用小物件生成form元素 $form=$this->beginWidget('CActiveForm'); ?> <!--用户名--> <?php echo $form->labelEx($model,'username');?> <?php echo $form->textField($model,'usernam

随机推荐