Ich Art, dies zu lösen, ist die Lösung nicht so schön, aber immer noch, ich denke, es wird anderen Menschen nützlich sein. Ich benutze CLI in der Tat habe ich bereits die Datei machen jedes Update machen die Nummer in der Datenbank, ähnlich der in der Timo-Antwort, bevor Sie diese Frage, aber das ist immer noch nicht sehr effektiv, aber es lohnt sich sowieso.
Was ich nächste Art von Lösungen Sachen getan habe, gehen Sie zu doctrine/lib/Doctrine/Migration/Builder.php
Zeile 531. Es gibt die Definition der Standardklasse jede Migration wird erweitert. Da ich CLI benutze und keine Möglichkeit fand, Parameter an diesen Ort zu übergeben, habe ich gerade Doctrine_Migration_Base
in eine andere Klasse MY_Doctrine_Migration_Base
getauscht, die unten steht.
Wenn Sie nicht CLI verwenden, würde ich sagen, dass Sie versuchen sollten, Optionen zu übergeben und Quelle nicht zu ersetzen.
Also die unten genannte Klasse erweitert Doctrine_Migration_Base
und überschreibt eine Reihe von Methoden zu denen, überprüft, ob es in Ordnung ist, Änderungen vorzunehmen und dann die übergeordnete Methode, um sie zu tun. Es deckt nicht alle Methoden ab, die ich gerade gemacht habe, als ich das geschrieben habe.
Jetzt erstellt jede Migration Doctrine erweitert meine Klasse, die die ursprünglich erwähnten Probleme verhindern soll.
<?php
class MY_Doctrine_Migration_Base extends Doctrine_Migration_Base {
public function __construct() {
$this->connection = Doctrine_Manager::getInstance()->getCurrentConnection();
}
public function addIndex($tableName, $indexName, array $definition) {
foreach ($this->connection->execute("SHOW INDEXES IN $tableName")->fetchAll(PDO::FETCH_ASSOC) as $index) {
if ($index['Key_name'] === $indexName.'_idx') {
echo "Index $indexName already exists in table $tableName. Skipping\n";
return;
}
}
parent::addIndex($tableName, $indexName, $definition);
}
public function removeColumn($tableName, $columnName) {
if ($this->column_exists($tableName, $columnName)) {
parent::removeColumn($tableName, $columnName);
} else {
echo "Column $columnName doesn't exist in $tableName. Can't drop\n";
}
}
public function createTable($tableName, array $fields = array(), array $options = array()) {
if ($this->connection->execute("SHOW TABLES LIKE '$tableName'")->fetchAll(PDO::FETCH_ASSOC)) {
echo "Table $tableName already exists. Can't create\n";
} else {
parent::createTable($tableName, $fields, $options);
}
}
public function addColumn($tableName, $columnName, $type, $length = null, array $options = array()) {
if (! $this->column_exists($tableName, $columnName)) {
parent::addColumn($tableName, $columnName, $type, $length, $options);
} else {
echo "Column $columnName already exists in $tableName. Can't add\n";
}
}
private function column_exists($tableName, $columnName) {
$exception = FALSE;
try { //parsing information_schema sucks because security will hurt too bad if we have access to it. This lame shit is still better
$this->connection->execute("SELECT $columnName FROM $tableName")->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $exception) {}
//if someone knows how to check for column existence without exceptions AND WITHOUT INFORMATION SCHEMA please rewrite this stuff
return $exception === FALSE;
}
}
Vorschläge, wie dies verbessert werden kann, sind willkommen.