Symfony2 execute SQL file in Doctrine Fixtures Load Symfony2 execute SQL file in Doctrine Fixtures Load symfony symfony

Symfony2 execute SQL file in Doctrine Fixtures Load


I find a good solution. I didn't find an exec method in class ObjectManager, so... this work very well for me.

public function load(ObjectManager $manager){    // Bundle to manage file and directories    $finder = new Finder();    $finder->in('web/sql');    $finder->name('categories.sql');    foreach( $finder as $file ){        $content = $file->getContents();        $stmt = $this->container->get('doctrine.orm.entity_manager')->getConnection()->prepare($content);        $stmt->execute();    }}

In this solution your fixture class has to implement the ContainerAwareInterface with the method

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


You can load the file contents as a string, and execute native SQL using the EntityManager:

class SQLFixtures extends AbstractFixture implements OrderedFixtureInterface{      $filename = '/path/to/sql/file.sql';  public function load(ObjectManager $manager) {    $sql = file_get_contents($filename);  // Read file contents    $manager->getConnection()->exec($sql);  // Execute native SQL    $manager->flush();  }  public function getOrder() {    return 99;  // Order in which this fixture will be executed  }}


Answer for Zend Framework 2.5.3 using Doctrine Data-Fixtures.

Not sure if this applies to the given answers, but they are trying a bit too hard. If you inspect the given $manager object, you'll find that it already is the EntityManager (of interface ObjectManager) (at least, in ZF2). As such you're able to get the Connection directly and it's possible to execute without using $this->container->get('doctrine.orm.entity_manager')

Below a snippet which I use for creating the first user "system", with a createdBy FK reference to itself.

public function load(ObjectManager $manager){    $sql = 'INSERT INTO users (              id, username, email, display_name, `password`, created_by)             VALUES (:id, :username, :email, :display_name, :password, :created_by)';    $password = $this->createSuperDuperEncryptedPassword();    // $manager === `EntityManager|ObjectManager`, `->getConnection()` is available    $stmt = $manager->getConnection()->prepare($sql);     $stmt->bindValue(':id', 1);    $stmt->bindValue(':username', 'system');    $stmt->bindValue(':email', 'system@system.test');    $stmt->bindValue(':display_name', 'system');    $stmt->bindValue(':password', password );       $stmt->bindValue(':created_by', 1);        // Self reference    $stmt->execute();}