![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5405271/Screen_Shot_2018-10-24_at_20.57.15.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376851/1_WSC0v9-ugCRbexQXaDraPg.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376845/zJaD3Bia_400x400.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376861/shutterstock_498302194-1000x480.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376761/turtle-animation-gif-12.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376749/cute-turtle-animated-gif-2.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376762/funny-turtle-animated-gif-6.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376748/funny-turtle-animated-gif-1.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376747/funny-turtle-animated-gif-2.gif)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376933/16071-thumb.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378732/flashmob.jpg)
Using
migrations & fixtures
Miro Svrtan
@msvrtan
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/3772040/Twitter_bird_logo_2012.png)
Migrations
Server migrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376780/1509009405.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376780/1509009405.png)
Database system migrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376806/kisscc0-database-management-system-mysql-computer-icons-database-symbol-5b743a749ead51.58030654153434379665.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376806/kisscc0-database-management-system-mysql-computer-icons-database-symbol-5b743a749ead51.58030654153434379665.png)
Schema migrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376815/MySQL_Schema_Music_Example.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376816/Relational-Database-Schema-for-the-Product-Specification-System.png)
Schema migrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376816/Relational-Database-Schema-for-the-Product-Specification-System.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5376818/Drupal8_UPsitesWeb_Schema_10-19-2013.png)
Model schema
Database schema
Create migration
Calculate differences
Create migration file
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378779/doctrine_logo.png)
Model schema
Database schema
Source of truth!
Calculate differences
Create migration file
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378779/doctrine_logo.png)
<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
class Version2 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->addSql('CREATE TABLE user (id INT NOT NULL, username VARCHAR(180), ...)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_957A6479C05FB297 ON user (username)');
}
...
}
Version2
Version1
Run migration
Any new migrations?
Run migration `Version2`
Version1
Mark migration `Version2` as run
Version2
Version2
Run migration (again)
Any new migrations?
Nope, I'm done
Version1
Version1
<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
class Version2 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->addSql('CREATE TABLE user (id INT NOT NULL, username VARCHAR(180), ...)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_957A6479C05FB297 ON user (username)');
}
public function down(Schema $schema)
{
$this->addSql('DROP TABLE user');
}
}
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378779/doctrine_logo.png)
Move forward/ no rollbacks
<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
class Version20181027165500 extends AbstractMigration
{
public function up(Schema $schema)
{
...
}
public function down(Schema $schema)
{
..
}
}
Versioning
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378779/doctrine_logo.png)
<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
class Version20181027165500 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->abortIf('postgresql' !== $this->getDatabasePlatform(),
'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('CREATE TABLE user (id INT NOT NULL, username VARCHAR(180), ...)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_957A6479C05FB297 ON user (username)');
}
public function down(Schema $schema)
{
$this->abortIf('postgresql' !== $this->getDatabasePlatform(),
'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('DROP TABLE user');
}
}
Locked to vendor
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378779/doctrine_logo.png)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUserTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
...
});
}
public function down()
{
Schema::drop('users');
}
}
Laravel migrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5378789/laravel.png)
Deployment
Deploying on large datasets
Fixtures
'dummy' instead of production data
Fixtures
<?php
namespace App\DataFixtures\ORM;
use App\Entity\User;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
class UsersFixtures extends AbstractFixture
{
public function load(ObjectManager $manager)
{
$user1 = new User();
$user1->setId(1);
$user1->setUsername('username1');
$user1->setEmail('username1@example.com');
$user2 = new User();
$user2->setId(2);
$user2->setUsername('username2');
$user2->setEmail('username2@example.com');
$manager->persist($user1);
$manager->persist($user2);
$manager->flush();
}
}
<?php
namespace App\DataFixtures\ORM;
use App\Entity\User;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
class UsersFixtures extends AbstractFixture
{
public function load(ObjectManager $manager)
{
for ($i = 1; $i < 10; $i++) {
$user = new User();
$user->setId($i);
$user->setUsername('username'.$i);
$user->setEmail('username'.$i.'@example.com');
$manager->persist($user);
}
$manager->flush();
}
}
<?php
namespace App\DataFixtures\ORM;
use App\Entity\User;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
class UsersFixtures extends AbstractFixture
{
public function load(ObjectManager $manager)
{
for ($i = 1; $i < 10; $i++) {
$user = new User();
$user->setId($i);
$user->setUsername('username'.$i);
$user->setEmail('username'.$i.'@example.com');
$manager->persist($user);
}
$manager->flush();
}
}
<?php
namespace App\DataFixtures\ORM;
..
class UsersFixtures extends AbstractFixture
{
public function load(ObjectManager $manager)
{
$alex = new User();
$alex->setId(1);
$alex->setUsername('alex');
$alex->setEmail('alex@example.com');
$sasha = new User();
$sasha->setId(2);
$sasha->setUsername('sasha');
$sasha->setEmail('sasha@example.com');
$manager->persist($alex);
$manager->persist($sasha);
$manager->flush();
}
}
Proper naming!
Demo time
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5380569/Unknown.jpg)
Thank you!
Miro Svrtan
@msvrtan
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/3772040/Twitter_bird_logo_2012.png)
Feedback -> https://joind.in/talk/6c119
miro (at) mirosvrtan.me
![](https://s3.amazonaws.com/media-p.slid.es/uploads/75324/images/5359946/584856b4e0bb315b0f7675ac.png)
Any questions?
Using migrations and fixtures
By Miro Svrtan
Using migrations and fixtures
- 2,238