首页 后端开发 php教程 Yii解决DeleteAll连表删除报错问题

Yii解决DeleteAll连表删除报错问题

Jan 02, 2018 pm 01:05 PM
报错 问题

本文主要介绍了Yii使用DeleteAll连表删除出现报错问题的解决方法,分析了相关的SQL语句及出现错误的原因与改正方法,需要的朋友可以参考下。希望对大家有所帮助。

具体如下:

删除数据的时候,经常会遇到连联判断删除数据的条件,今天用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;
}
登录后复制

相关推荐:

Yii2实现rbac权限控制

Yii运行机制及路由详解

加载Yii自带的验证码功能的方法

以上是Yii解决DeleteAll连表删除报错问题的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

原因分析:HTTP请求错误504网关超时 原因分析:HTTP请求错误504网关超时 Feb 19, 2024 pm 05:12 PM

http请求报错:504GatewayTimeout的原因简介:在进行网络通信中,客户端通过发送HTTP请求与服务端进行交互。但是,有时候在发送请求的过程中,我们可能会遇到一些错误信息。其中之一就是504GatewayTimeout错误。本文将会探讨这个错误的原因和解决方法。什么是504GatewayTimeout错误?GatewayTimeo

解决方案:处理HTTP请求时出现的Socket Error 解决方案:处理HTTP请求时出现的Socket Error Feb 25, 2024 pm 09:24 PM

http请求报错:SocketError的解决方法在进行网络请求时,我们经常会遇到各种各样的错误,其中一个常见的问题就是SocketError。当我们的应用程序无法与服务器建立连接时,就会抛出这个错误。在本文中,我们将讨论SocketError的一些常见原因和解决方法。首先,我们需要了解Socket是什么。Socket是一种通信协议,它允许应用程序通过

快速解决pyqt5安装报错的步骤指南 快速解决pyqt5安装报错的步骤指南 Jan 19, 2024 am 09:32 AM

如果你正在学习Python并且想要开发GUI应用程序,那么PyQt5是一个非常好的选择。它是Python下PyQt库的一个绑定版本,可以非常方便地实现对Qt图形库的调用和开发。不过,有时你在安装PyQt5时可能会遇到一些问题。本指南将为你提供一些快速解决安装报错问题的步骤,同时具体附上代码实例。确保Python版本正确PyQt5是基于Python的库,因此首

教你如何诊断常见问题的iPhone故障 教你如何诊断常见问题的iPhone故障 Dec 03, 2023 am 08:15 AM

iPhone以其强大的性能和多方面的功能而闻名,它不能幸免于偶尔的打嗝或技术困难,这是复杂电子设备的共同特征。遇到iPhone问题可能会让人感到沮丧,但通常不需要警报。在这份综合指南中,我们旨在揭开与iPhone使用相关的一些最常遇到的挑战的神秘面纱。我们的分步方法旨在帮助您解决这些常见问题,提供实用的解决方案和故障排除技巧,让您的设备恢复到最佳工作状态。无论您是面对一个小故障还是更复杂的问题,本文都可以帮助您有效地解决这些问题。一般故障排除提示在深入研究具体的故障排除步骤之前,以下是一些有助于

http请求报错:504 Gateway Timeout的解决方法 http请求报错:504 Gateway Timeout的解决方法 Feb 22, 2024 am 08:27 AM

标题:http请求报错:504GatewayTimeout的解决方法简介:在进行网络请求的过程中,有时可能会遇到http请求报错的情况。其中一种常见的错误是504GatewayTimeout错误。本文将介绍504GatewayTimeout错误的含义和可能的原因,并提供解决该错误的一些方法。正文:504GatewayTimeout错误是什么意

如何处理Laravel API报错问题 如何处理Laravel API报错问题 Mar 06, 2024 pm 05:18 PM

标题:如何处理LaravelAPI报错问题,需要具体代码示例在进行Laravel开发时,经常会遇到API报错的情况。这些报错可能来自于程序代码逻辑错误、数据库查询问题或是外部API请求失败等多种原因。如何处理这些报错是一个关键的问题,本文将通过具体的代码示例来演示如何有效处理LaravelAPI报错问题。1.错误处理在Laravel

解决UniApp报错:无法找到'xxx'动画效果的问题 解决UniApp报错:无法找到'xxx'动画效果的问题 Nov 25, 2023 am 11:43 AM

解决UniApp报错:无法找到'xxx'动画效果的问题UniApp是一种基于Vue.js框架的跨平台应用开发框架,可以用于开发微信小程序、H5、App等多个平台的应用。在开发过程中,我们经常会使用到动画效果来提升用户体验。然而,有时候会遇到一个报错:无法找到'xxx'动画效果。这个报错会导致动画无法正常运行,给开发带来不便。本文将介绍几种解决这个问题的方法。

解决jQuery无法获取表单元素值的方法 解决jQuery无法获取表单元素值的方法 Feb 19, 2024 pm 02:01 PM

解决jQuery.val()无法使用的问题,需要具体代码示例对于前端开发者,使用jQuery是常见的操作之一。其中,使用.val()方法来获取或设置表单元素的值是非常常见的操作。然而,在一些特定的情况下,可能会出现无法使用.val()方法的问题。本文将介绍一些常见的情况以及解决方案,并提供具体的代码示例。问题描述在使用jQuery开发前端页面时,有时候会碰

See all articles