symfony2anddoctrine-100623202058-phpapp01

Embed Size (px)

Citation preview

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    1/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    2/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Updated DoctrineBundle

    Doctrine2 features fully integrated Database Abstraction Layer Object Relational Mapper

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    3/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DoctrineMongoDBBundle

    MongoDB Object Document Mapper Transparent persistence to MongoDB Same architecture as ORM Map a class as an entity and document

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    4/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DoctrineMigrationsBundle

    Integration with the database migrationsproject.

    Easily manage and deploy di f erent versionsof your database.

    Generate migrations when you change yourschema mapping information

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    5/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DBAL

    To use just the DBAL you must congure it:

    doctrine.dbal : dbname: Symfony user: root password: ~

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    6/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    7/55Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DBAL Console Commands

    Create all congured databases

    Create a specic database

    Drop all congured databases

    Drop a specic database

    $ php cons ole doctrine:datab ase:create

    $ php cons ole doctrine:datab ase:create --co nnection=d efault

    $ php cons ole doctrine:datab ase:drop

    $ php cons ole doctrine:datab ase:drop --con nection=de fault

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    8/55Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DBAL Console Commands

    Execute SQL queries

    Specify connection

    $ php cons ole doctrine:query :sql SELECT * FROM us er

    $ php cons ole doctrine:query :sql ... --conn ection=defa ult

    http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    9/55Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DBAL

    Get the default congured databaseconnection:

    class MyController ext ends Doctrin eControl ler{

    public function indexAction (){

    $conn = $this -> getDatabaseConnection();

    // ...

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    10/55Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    DBAL

    Get a congured database connection serviceby its name:

    class MyController exten ds DoctrineC ontroller{

    public function indexAction (){

    $conn = $this -> getDatabaseConnection( 'default' );

    // ...}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    11/55Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    The EntityManager Central place for persisting and retrieving entities Multiple instances allowed One EntityManager per database connection

    Dependency Injection handles the creation andmanagement of entity manager services

    $config = new \ Doctrine \ ORM\Configuration ();$config -> setMetadataCacheImpl( new \ Doctrine \ Common\ Cache \ ArrayCache );$driverImpl = $config -> newDefaultAnnotationDriver( array ( __DIR__ . "/Entities" ));$config -> setMetadataDriverImpl( $driverImpl );

    $config -> setProxyDir( __DIR__ . '/Proxies' );$config -> setProxyNamespace( 'Proxies' );

    $connectionOptions = array ( 'driver' => 'pdo_sqlite' , 'path' => 'database.sqlite');

    $em = \ Doctrine \ ORM\ EntityManager :: create( $connectionOptions , $config );

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    12/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    What is an Entity? It is a regular PHP objectthat has been mapped to the Doctrine2 ORM:/** @Entity */class User{ /**

    * @Id @Column(type="integer")* @GeneratedValue*/

    private $id ;

    /** @Column(type="string", length=255) */ private $name ;

    public function getId (){

    return $this -> id ;}

    public function getName (){

    return $this -> name;}

    public function setName ( $name){

    $this -> name = $name;}

    }

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    13/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    14/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Congure an entity manager to start usingthe ORM:

    doctrine.or m:

    default_entity_manager: default cache_driver: apc # array, apc, memcache, xcache entity_managers: default: connection: default

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    15/55

    Console commands implemented forimproved developer workow:

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    16/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Console commands implemented forimproved developer workow: Ensure production settings Clear metadata, query and result cache Load data xtures

    Create and drop congured databases Generate entities from mapping information Generate new skeleton entities Generate skeleton entity repository classes Convert mapping information between formats

    Convert a Doctrine1 schema Import mapping information from an existing database Execute DQL and SQL queries Create, drop and update database schema from mapping information

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    17/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Get the default congured entity managerservice:

    class MyController extend s DoctrineCon troller

    { public function indexAction (){

    $em = $this -> getEntityManager();

    // ...}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    18/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    19/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Persisting entities is as simple as creating theobject and telling Doctrine to persist it:class MyController extends DoctrineContro ller{ public function createAction ()

    { $em = $this -> getEntityManager();

    $user = new User (); $user -> setName( 'Jonathan H. Wage' ); $em-> persist( $user );

    $em-> flush(); // ...

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    20/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Creating Query instances and issue DQLqueries to retrieve objects:class MyController extends DoctrineControl ler{ public function indexAction ()

    { $em = $this -> getEntityManager(); $query = $em-> createQuery( 'select u from MyBundle:User u' );

    $users = $query -> execute();

    // ...}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    21/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Creating QueryBuilder instances toprogramatically build DQL queries through auent interface:

    class MyController extends Doct rineController{ public function indexAction ()

    { $em = $this -> getEntityManager(); $qb = $em-> createQueryBuilder() -> select( 'u' ) -> from( 'MyBundle:User' , 'u' );

    $query = $qb -> getQuery(); $users = $query -> execute();

    // ...}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    22/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Update your database schema duringdevelopment as your domain model evolves

    Add a new column to our User entity

    /** @Entit y */class User{ // ...

    /** @Column(type="string", length=255) */ private $email ;}

    http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    23/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    ORM

    Run update command to update yourdatabase schema from mapping information

    The above compares your current databaseschema to your new mapping information andexecutes the necessary queries to bring yourdatabase up-to-date.

    $ php cons ole doctrine:sche ma:update

    http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    24/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Object Document Mapper

    New Doctrine Project for persisting objects toMongoDB

    Same architecture as ORM

    Transparently persist PHP5 objects toMongoDB

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    25/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    The DocumentManager Central place for persisting and retrieving documents Multiple instances allowed

    Dependency Injection handles the creation andmanagement of document manager services

    $config = new Configuration ();

    $config -> setProxyDir( __DIR__ . '/Proxies' );$config -> setProxyNamespace( 'Proxies' );$config -> setDefaultDB( 'doctrine_odm_sandbox' );

    $reader = new AnnotationReader ();$reader -> setDefaultAnnotationNamespace( 'Doctrine\ODM\MongoDB\Mapping \\ ' );$config -> setMetadataDriverImpl( new AnnotationDriver ( $reader , __DIR__ . '/Documents' ));

    $dm = DocumentManager :: create( new Mongo(), $config );

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    26/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    27/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    If the defaults are good enough for you thenyou can omit all the previous options:

    doctrine_odm.mongodb : ~

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    28/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    What is a Document? It is a regular PHP objectthat has been mapped to the MongoDB ODM:/** @Document */class User{ /**

    * @Id

    */ private $id ;

    /** @String */ private $name ;

    public function getId (){

    return $this -> id ;}

    public function getName (){

    return $this -> name;}

    public function setName ( $name ){

    $this -> name = $name ;}

    }

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    29/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Get the default congured documentmanager:

    class MyController extend s DoctrineCon troller

    { public function indexAction (){

    $dm = $this -> getDocumentManager();

    // ...

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    30/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Get a congured document manager by itsname:

    class MyController extend s DoctrineCon troller{ public function indexAction ()

    { $dm = $this -> getDocumentManager ( 'default' );

    // ...

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    31/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Just like the ORM persisting documents iseasy:class MyController extends DoctrineContro ller{ public function createAction ()

    { $dm = $this -> getDocumentManager();

    $user = new User (); $user -> setName( 'Jonathan H. Wage' ); $dm-> persist( $user );

    $dm-> flush(); // ...

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    32/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Change tracking All objects are tracked in an identity map Changesets are calculated on ush Changesets are used to perform updates using

    the atomic operators The following code results in an e cient mongo update

    with only the properties that need updated:

    $user -> s etName( 'new n ame' );$dm-> flush();

    Array(

    [$set] => Array(

    [name] => new name)

    )

    ->

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    33/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Traditional MongoDB nd() and ndOne()

    $users = $dm-> find( 'User ' , $criteria ) ;

    $query = $dm-> findOne( 'User' , array ( 'username' => 'jwage' ));$user = $query -> getSingleResult();

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    34/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Query API for building MongoDB queriesthrough a uent OO interface:

    class MyController extend s DoctrineCon troller{ public function indexAction ()

    { $dm = $this -> getDocumentManager(); $query = $dm-> createQuery( 'MyBundle:User' );

    $users = $query -> execute();

    // ...}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    35/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    36/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Fluent Query interface generates andexecutes nd() and ndOne() methodsinternally

    Query information is collected via uent oointerface and executed later

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    37/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Document Query Language (DQL) SQL like grammar for querying MongoDB

    Query types supported Find Insert Update

    Remove

    http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    38/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    39/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Selecting elds

    $query = $dm-> query( 'find username, pass word User' );

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    40/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    $slice operator for paging embeddedcollections

    $query = $dm-> query( 'fin d comments sk ip 20 lim it 10 Post' );

    Array([comments] => Array

    ([$slice] => Array

    ([0] => 20

    [1] => 10)

    )

    )

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    41/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    42/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Complex update$query = $dm-> query( " update User inc coun t = 1, incviews = 2, set username = 'jwage'" );

    Array([$inc] => Array

    ([count] => 1[views] => 2

    )

    [$set] => Array(

    [username] => jwage)

    )

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    43/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    MongoDB ODM

    Document Query Language (DQL) atomic operators skip and limit main results skip and limit embedded documents use dot notation for querying embedded

    documents embed JSON values in your DQL syntax

    $query = $dm-> query( "upda te User pushA ll groups = '[1, 2, 3]'" );

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    44/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations

    New DoctrineMigrationsBundle containsintegration with the Doctrine DatabaseMigrations project

    Migrations have been completely re-writtenfrom Doctrine1 and are an extension of thedatabase abstraction layer

    http://www.doctrine-project .org/projects/m igrations

    http://www.sympalphp.org/http://www.sensiolabs.com/http://www.doctrine-project.org/projects/migrationshttp://www.doctrine-project.org/projects/migrationshttp://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    45/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations

    Migration classes:

    class Versi on20100416130401 extends Abstra ctMigratio n{

    public function up ( Schema $schema ){

    }

    public function down( Schema $schema ){

    }}

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    46/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations

    Manually execute SQL for migrations:

    class Versi on20100416130422 extends Abstra ctMigratio n{ public function up ( Schema $schema )

    { $this -> _addSql( ' CREATE TABLE addresses (id INT NOT NULL, streetVARCHAR( 255 ) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB ' );

    }

    public function down( Schema $schema ){

    $this -> _addSql( 'DROP TABLE addresses' );}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    47/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations

    Use API of Schema objects to performmigration:

    class Versi on20100416130401 extends Abstra ctMigratio n{ public function up ( Schema $schema )

    { $table = $schema -> createTable( 'users' ); $table -> addColumn( 'username' , 'string' ); $table -> addColumn( 'password' , 'string' );

    }

    public function down( Schema $schema ){

    $schema -> dropTable( 'users' );}

    }

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    48/55

  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    49/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations

    Execute migration dry runs:

    Omit --dry-run to execute migration.

    $ ./doctrine migra tions:migrate --dry-run Are you sure you w ish to continue?

    yExecuting dry run of migration up to 20100416130452 from 0

    >> migrating 20100416130452

    -> CREATE TABLE users (username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL) ENGINE = InnoDB

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    50/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations Specify a version number to revert to or 0 to

    revert all migrations:

    $ ./doctrine migra tions:migrate 0 Are you sure you w ish to continue?

    yMigrating down to 0 from 20100416130401

    -- reverting 20100416130401

    -> DROP TABLE users

    -- reverted

    b

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    51/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations Write migration SQL le instead of executing:

    It would produce a le like:

    $ ./doctrine migra tions:migrate --write-sqlExecuting dry run of migration up to 2010041 6130401 from 0

    >> migrating 20100416130401

    -> CREATE TABLE users (username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL) ENGINE = InnoDB

    Writing migration file to "/path/to/sandbox/doctrine_migration_20100416130405.sql"

    # Doctrine Migrati on File Generated on 2010- 04-16 13:04:05# Migrating from 0 to 20100416130422

    # Version 20100416130401CREATE TABLE users (username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL) ENGINE = InnoDB;

    b

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    52/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations Integration with ORM for generating

    migrations when you change your mappinginformation. Add a new property to yourEntity:

    Run the migrations di f command:$ ./doctrine migra tions:diffGenerated new migr ation class to "/path/to/m igrations/DoctrineMigrat ions/Version2010 0416130459.php" from schema differences.

    /** @Entity @Table(name="users ") */ class User

    { /**

    * @var string $test*/

    private $test;

    // ...}

    b i i

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    53/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations The generated migration class looks like:

    It contains the SQL statements required toupdate your database with the schemachanges.

    class Version2 0100416130459 extends AbstractMigration{ public function up ( Schema $schema )

    { $this -> _addSql( ' ALTER TABLE users ADD test VARCHAR( 255 ) NOT NULL' );

    }

    public function down( Schema $schema ){

    $this -> _addSql( ' ALTER TABLE users DROP test ' );}

    }

    D b Mi i

    http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    54/55

    Doctrine 2 www.doctrine-project.org www.sensiolabs.com

    Database Migrations Run migrate command to execute the

    generated migration:

    Now your database is up to date and containsthe new column named test.

    $ ./doctrine migra tions:migrate

    http://www.sympalphp.org/http://www.sensiolabs.com/http://www.sensiolabs.com/http://www.sympalphp.org/http://www.sympalphp.org/
  • 8/6/2019 symfony2anddoctrine-100623202058-phpapp01

    55/55