DoctrineMigrationsBundle bize entityler içinde yaptığımız değişiklikleri, veritabanına el eli yansıtmak yerine otomatik olarak yansıtmamıza yardımcı olur. Mevcut olan diff komutunu çalıştırdığımız zaman uygulamamız içindeki entity classları veritabanıyla kayşılaştırır ve tüm farklılıkları migration dosyasına ekler. Çalışma mantığı aşağıdaki gibidir:



Buradaki kritik olan şey, diff komutunu çalıştırarak migration dosyasını yaratmadan önce, entity veya entitiler ile ilgili değişikliklerin veritabanında olmadığına emin olun. Aksi takdirde diff komutu her hangi bir değişiklik ile karşılaşmayacağı için, sonuç olarak içi boş bir migration dosyası yaratacaktır.


Not: Eğer migration komutunu ilk kez çalıştırıyorsanız, migration işlemi veritabanında migration_versions tablosunu otomatik olarak yaratacaktır. Daha sonra versiyon isimlerini içine ekleyecektir.


Örneğimiz


Veritabanında app_user isminde bir tablo var ama ben uygulamamdaki AppUser ismindeki entity class'ı sildim, bu nedenle migration app_user tablosunu silecektir. Daha sonra uygulamama Customer isminde yeni bir entity class ekledim ama alakalı tablo veritabanında olmadığından, migration veritabanında customer isminde bir tablo oluşturacaktır.


Composer


Terminal'de DoctrineMigrationsBundle'ı yüklemek için composer require doctrine/doctrine-migrations-bundle "^1.3" komutunu çalıştırın ve new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(), satırını AppKernel.php dosyasına ekleyin.


Konfigürasyon


#config.yml
doctrine_migrations:
dir_name: "%kernel.root_dir%/DoctrineMigrations"
namespace: CustomerBundle
table_name: migration_versions
name: Application Migrations
organize_migrations: false

Veritabanı


Şu anda veritabanımızda sadece app_user tablosu var.


mysql> SHOW TABLES;
+------------------+
| Tables_in_common |
+------------------+
| api_user |
+------------------+
1 row in set (0.00 sec)

Customer entity


Aşağıdaki entity class'ı yaratın. Ben kodu kısa tutmak için bildiğiniz diğer klasik parçaları sildim ama malum siz silmemelisiniz.


namespace CustomerBundle\Entity;

class Customer
{
private $id;
private $name;
private $dob;
}

Migrations dosyasını yaratma


$ php bin/console doctrine:migrations:diff
Generated new migration class to "/var/www/html/symfony/common/app/DoctrineMigrations/Version20171208210144.php" from schema differences.

$ cat app/DoctrineMigrations/Version20171208210144.php

namespace CustomerBundle;

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

/**
* Auto-generated Migration: Please modify to your needs!
*/
class Version20171208210144 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

$this->addSql('CREATE TABLE customer (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(50) NOT NULL, dob DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
$this->addSql('DROP TABLE api_user');
}

public function down(Schema $schema)
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

$this->addSql('CREATE TABLE api_user (id INT AUTO_INCREMENT NOT NULL, api_key VARCHAR(36) NOT NULL COLLATE utf8_unicode_ci, roles LONGTEXT NOT NULL COLLATE utf8_unicode_ci COMMENT \'(DC2Type:array)\', UNIQUE INDEX unq_api_key (api_key), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
$this->addSql('DROP TABLE customer');
}
}

Migration komutunu çalıştırma


$ php bin/console doctrine:migrations:migrate --no-interaction

Application Migrations


Migrating up to 20171208210144 from 0

++ migrating 20171208210144

-> CREATE TABLE customer (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(50) NOT NULL, dob DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB
-> DROP TABLE api_user

++ migrated (0.41s)

------------------------

++ finished in 0.41s
++ 1 migrations executed
++ 2 sql queries

Veritabanı


mysql> SHOW TABLES;
+--------------------+
| Tables_in_common |
+--------------------+
| customer |
| migration_versions |
+--------------------+
2 rows in set (0.01 sec)

mysql> SELECT * FROM migration_versions;
+----------------+
| version |
+----------------+
| 20171208210144 |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM customer;
Empty set (0.01 sec)