Maison > Article > développement back-end > Yii résout le problème de rapport d'erreur de suppression de la table de connexion DeleteAll
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!