Maison  >  Article  >  développement back-end  >  Yii résout le problème de rapport d'erreur de suppression de la table de connexion DeleteAll

Yii résout le problème de rapport d'erreur de suppression de la table de connexion DeleteAll

*文
*文original
2018-01-02 13:05:471597parcourir

Cet article présente principalement la solution au problème d'erreur lorsque Yii utilise DeleteAll pour supprimer les tables concaténées. Il analyse les instructions SQL pertinentes et les causes et méthodes de correction des erreurs peuvent s'y référer. J'espère que cela aide tout le monde.

Les détails sont les suivants :

Lors de la suppression de données, nous rencontrons souvent les conditions permettant de déterminer la suppression des données. Aujourd'hui, nous utilisons CDbCriteria de Yii pour générer les conditions pertinentes. 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);

L'erreur SQL 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))

Trace retour à 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;
}

Recommandations associées :

Yii2 implémente le contrôle des autorisations rbac

Explication détaillée du mécanisme de fonctionnement et du routage de Yii

Comment charger la propre fonction de code de vérification de Yii

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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