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 !