Maison > php教程 > PHP开发 > Solution Yii au problème du rapport d'erreurs lors de l'utilisation de DeleteAll pour supprimer des tables concaténées

Solution Yii au problème du rapport d'erreurs lors de l'utilisation de DeleteAll pour supprimer des tables concaténées

高洛峰
Libérer: 2016-12-30 16:22:03
original
1314 Les gens l'ont consulté

L'exemple de cet article décrit comment résoudre le problème du rapport d'erreurs lors de la suppression de tables concaténées à l'aide de DeleteAll dans Yii. Je voudrais le partager avec vous pour votre référence. Les détails sont les suivants :

Lors de la suppression de données, vous rencontrez souvent les conditions permettant de déterminer la suppression des données. Aujourd'hui, j'ai utilisé CDbCriteria de Yii pour générer les éléments pertinents. conditions. La base de données signale une erreur lors de la suppression par lots.

Le code de la page est :

$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);
Copier après la connexion

Le code SQL incorrect est :

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))
Copier après la connexion

L'instruction SQL correcte doit être :

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))
Copier après la connexion

Remontez jusqu'à la classe de base 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;
}
Copier après la connexion

Solution. Modifier la méthode de la classe de base :

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;
}
Copier après la connexion

J'espère que cet article sera utile à la conception de programmes PHP de chacun basés sur le framework Yii.

Pour plus d'articles liés à Yii sur la façon de résoudre le problème du rapport d'erreurs lors de la suppression de tables liées à l'aide de DeleteAll, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal