Heim > php教程 > PHP开发 > Yii-Lösung für das Problem der Fehlerberichterstattung bei Verwendung von „DeleteAll' zum Löschen verketteter Tabellen

Yii-Lösung für das Problem der Fehlerberichterstattung bei Verwendung von „DeleteAll' zum Löschen verketteter Tabellen

高洛峰
Freigeben: 2016-12-30 16:22:03
Original
1323 Leute haben es durchsucht

Das Beispiel in diesem Artikel beschreibt, wie das Problem der Fehlerberichterstattung beim Löschen verketteter Tabellen mithilfe von DeleteAll in Yii gelöst werden kann. Ich möchte es Ihnen als Referenz mitteilen:

Beim Löschen von Daten stoßen Sie häufig auf die Bedingungen für die Löschung von Daten. Heute habe ich die CDbCriteria von Yii verwendet, um die relevanten Daten zu generieren Bedingungen. 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);
Nach dem Login kopieren

Die falsche SQL 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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

Ich hoffe, dass dieser Artikel für alle auf dem Yii-Framework basierenden PHP-Programmdesigns hilfreich sein wird.

Weitere Yii-bezogene Artikel zur Lösung des Problems der Fehlerberichterstattung beim Löschen verknüpfter Tabellen mit DeleteAll finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage