Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add data when running Symfony migrations

I have a Symfony project that is using the DoctrineMigrations bundle, and I have a really simple question: When I run a migration (e.g., when I'm pushing an update to production), how can I insert data to the database?

For example: I have an Entity which is the type of an add. The entity is:

private $addType; // String
private $type1;   // Boolean
private $type2;   // Boolean
private $type3;   // Boolean

I add another field ($type4), and I want to add a new record to the database, with this values:

$addType = 'Type number 4';
$type1 = false;
$type2 = false;
$type3 = false;
$type4 = true;

How can this be done with DoctrineMigrations? Is it possible?

like image 950
mHouses Avatar asked Aug 07 '15 12:08

mHouses


4 Answers

Using the Entity Manager as suggested in another answer is not a good idea, as it leads to troubles later.

In the first migration, I created a table with users and populated some users via $em->persist($user); which seemed fine at the beginning.

But after a month, I added a phone column to my User model. And Doctrine generates INSERT statements with this column within the first migration, which fails due to the non-existing column phone. Of course it doesn't exist yet in the first migration. So it is better to go with pure SQL INSERTs.

like image 112
Josef Svoboda Avatar answered Oct 16 '22 00:10

Josef Svoboda


I just asked a related related question.

It is possible to use the migrations bundle to add data to the database. If you add a new property and use the doctrine mapping then the

php app/console doctrine:migrations:diff

command will generate a new migration file. You can just put your insert statements inside this file using the syntax:

$this->addSql('INSERT INTO your_table (name) VALUES ("foo")');

Make sure you put it after the auto-generated schema changes though. If you want to separate your schema changes and your data changes then you can use

php app/console doctrine:migrations:generate

to create an empty migrations file to put your insert statements in.

Like I said in my related question, this is one way to do it, but it requires manually creating these if you want to change this data in the database.

Edit:

Since this answer seems to get a few views I think it's worth adding that to more clearly separate the data changes from the schema changes there is a postUp method that can be overridden and that will be called after the up method.

https://www.doctrine-project.org/projects/doctrine-migrations/en/3.0/reference/migration-classes.html#postup

like image 30
mickadoo Avatar answered Oct 15 '22 22:10

mickadoo


I've "found" the correct way to solve my problem (insert data after running migrations, using my entity classes).

Here is: https://stackoverflow.com/a/25960400

The idea is to declare the migration as ContainerAware, and then, from the postUp function, call the DI to get the EntityManager. It's really easy, and you can use all your entities and repositories.

// ...
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class Version20130326212938 extends AbstractMigration implements ContainerAwareInterface
{

    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function up(Schema $schema)
    {
        // ... migration content
    }

    public function postUp(Schema $schema)
    {
        $em = $this->container->get('doctrine.orm.entity_manager');
        // ... update the entities
    }
}
like image 3
mHouses Avatar answered Oct 15 '22 23:10

mHouses


when you make the new field you need to enter this annotation "options={"default":1}" and it should work.

/**
 * @var boolean
 * @ORM\Column(name="type4", type="boolean", options={"default":1})
 */
private $type4 = true;

Took me some time to figure this out :)

like image 3
Favian Ioel P Avatar answered Oct 16 '22 00:10

Favian Ioel P