SQLServerとASPをSymfony2とMySQLに基づいて古いWebアプリを移行しています。クエリを実行し、古いデータを個々のSQLファイルにエクスポートします。これらのファイルをフィクスチャで実行するにはどうすればよいですか。 、コマンドを実行すると
$php app/console doctrine:fixtures:load
これで、Doctrine ORMおよびエンティティと直接連携するフィクスチャがいくつかありますが、インポートするデータがたくさんあります。
私は良い解決策を見つけます。クラスexec
にObjectManager
メソッドが見つからなかったので、...これは私にとって非常にうまく機能します。
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;
}
ファイルの内容を文字列としてロードし、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
}
}
Doctrine Data-Fixtures を使用したZend Framework2.5.3の回答。
これが与えられた答えに当てはまるかどうかはわかりませんが、彼らは少し努力しすぎています。与えられた_$manager
_オブジェクトを調べると、それはすでにEntityManager
(_interface ObjectManager
_の)であることがわかります(少なくともZF2では)。そのため、Connection
を直接取得でき、$this->container->get('doctrine.orm.entity_manager')
を使用せずに実行することができます。
最初のユーザー「システム」を作成するために使用するスニペットの下に、それ自体へのcreatedBy
FK参照があります。
_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();
}
_