08/12/2017 - DOCTRINE, SYMFONY
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.
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.
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.
#config.yml
doctrine_migrations:
dir_name: "%kernel.root_dir%/DoctrineMigrations"
namespace: CustomerBundle
table_name: migration_versions
name: Application Migrations
organize_migrations: false
Ş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)
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;
}
$ 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');
}
}
$ 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
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)