사용할 수있는 명령의 목록에 표시되며,이 솔루션은 모든 좋은 것이 아니라 여전히 것 같아요 그것은 다른 사람들에게 유용 할 것입니다. 저는 실제로 CLI를 사용하고 있습니다. 이미 모든 마이 그 레이션을 데이터베이스의 번호로 업데이트 한 파일을 작성했습니다.이 질문을하기 전에 티모의 대답과 유사하지만 여전히 효과적이지는 않지만 어쨌든 가치가 있습니다.
다음 해결 방법은 doctrine/lib/Doctrine/Migration/Builder.php
행 531입니다. 마이그레이션 할 때마다 기본 클래스의 정의가 있습니다. CLI를 사용하고있어 매개 변수를 전달하는 방법을 찾지 못했기 때문에 아래에 다른 클래스 MY_Doctrine_Migration_Base
을 Doctrine_Migration_Base
으로 바 꾸었습니다.
CLI를 사용하지 않는 경우 옵션을 전달하고 소스를 바꾸지 말아야한다고 말하고 싶습니다.
따라서 아래 클래스는 Doctrine_Migration_Base
을 확장하고 여러 메서드를 덮어 씁니다. 변경을 확인한 다음 부모 메서드를 호출하여이를 수행하는지 확인합니다. 그것은 현재 모든 방법을 다루지는 않습니다. 내가 이것을 썼을 때 내가 만났던 것입니다.
이제 모든 마이그레이션 Doctrine은 원래 언급 한 문제를 방지하기위한 클래스 확장을 만듭니다.
<?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;
}
}
개선 방법에 대한 제안을 환영합니다.