web-dev-qa-db-ja.com

Symfony2はSQLファイルをDoctrine FixturesLoadで実行します

SQLServerとASPをSymfony2とMySQLに基づいて古いWebアプリを移行しています。クエリを実行し、古いデータを個々のSQLファイルにエクスポートします。これらのファイルをフィクスチャで実行するにはどうすればよいですか。 、コマンドを実行すると

$php app/console doctrine:fixtures:load

これで、Doctrine ORMおよびエンティティと直接連携するフィクスチャがいくつかありますが、インポートするデータがたくさんあります。

16
Pablo

私は良い解決策を見つけます。クラスexecObjectManagerメソッドが見つからなかったので、...これは私にとって非常にうまく機能します。

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();
    }
}

このソリューションでは、フィクスチャクラスはメソッドを使用してContainerAwareInterfaceを実装する必要があります

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

ファイルの内容を文字列としてロードし、EntityManagerを使用してネイティブSQLを実行できます。

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
  }
}
12

Doctrine Data-Fixtures を使用したZend Framework2.5.3の回答。

これが与えられた答えに当てはまるかどうかはわかりませんが、彼らは少し努力しすぎています。与えられた_$manager_オブジェクトを調べると、それはすでにEntityManager(_interface ObjectManager_の)であることがわかります(少なくともZF2では)。そのため、Connectionを直接取得でき、$this->container->get('doctrine.orm.entity_manager')を使用せずに実行することができます。

最初のユーザー「システム」を作成するために使用するスニペットの下に、それ自体へのcreatedByFK参照があります。

_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', '[email protected]');
    $stmt->bindValue(':display_name', 'system');
    $stmt->bindValue(':password', password );   
    $stmt->bindValue(':created_by', 1);        // Self reference
    $stmt->execute();
}
_
1
rkeet