Yii使用DeleteAll连表删除出现报错问题的解决方法
来源: 阅读:988 次 日期:2016-08-13 13:48:06
温馨提示: 小编为您整理了“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框架的PHP程序设计有所帮助。

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map