欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-04-02 16:19:04
本文实例讲述了yii使用deleteall连表删除出现报错问题的解决方法。分享给大家供大家参考,具体如下: 删除数据的时候,经常会遇到连联判断删除数据的条件,今天用yii...

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