Heim  >  Artikel  >  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

高洛峰
高洛峰Original
2016-12-30 16:22:031252Durchsuche

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);

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))

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))

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;
}

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!

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