Heim  >  Artikel  >  Backend-Entwicklung  >  Yii löst das Problem des Löschfehlerberichts „DeleteAll“.

Yii löst das Problem des Löschfehlerberichts „DeleteAll“.

*文
*文Original
2018-01-02 13:05:471606Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn