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

高洛峰
高洛峰original
2016-12-30 16:22:031316parcourir

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);

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))

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))

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;
}

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;
}

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 !

Déclaration:
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