Heim >Backend-Entwicklung >PHP-Tutorial >Yii löst das Problem des Löschfehlerberichts „DeleteAll'.
Dieser Artikel stellt hauptsächlich die Lösung des Fehlerproblems vor, wenn Yii DeleteAll zum Löschen verketteter Tabellen verwendet. Er analysiert die relevanten SQL-Anweisungen und die Ursachen und Korrekturmethoden der Fehler. Ich hoffe, es hilft allen.
Die Details lauten wie folgt:
Beim Löschen von Daten stoßen wir häufig auf Bedingungen zur Bestimmung der Löschung von Daten. Heute verwenden wir die CDbCriteria von Yii, um entsprechende Bedingungen zu generieren. Beim stapelweisen Löschen meldet die Datenbank einen Fehler.
Der Seitencode lautet:
$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);
Der SQL-Fehler lautet:
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))
Die korrekte SQL-Anweisung sollte sein:
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 Zurück zur Yii-Basisklasse:
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; }
Lösung. Ändern Sie die Basisklassenmethode:
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; }
Verwandte Empfehlungen:
Yii2 implementiert die Rbac-Berechtigungssteuerung
Detaillierte Erläuterung des Betriebsmechanismus und der Weiterleitung von Yii
So laden Sie Yiis eigene Bestätigungscodefunktion
Das obige ist der detaillierte Inhalt vonYii löst das Problem des Löschfehlerberichts „DeleteAll'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!