我正在将基于SQL Server和ASP的旧Web应用程序迁移到Symfony2和MySQL。我做了一些查询并将旧数据导出到单个SQL文件。 当我运行命令
时,如何在我的灯具中执行thoses文件$php app/console doctrine:fixtures:load
现在我有一些直接与Doctrine ORM和实体一起工作的装置,但我有很多数据需要导入。
答案 0 :(得分:14)
我找到了一个很好的解决方案。我在课程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();
}
}
在此解决方案中,fixture类必须使用方法
实现ContainerAwareInterface
public function setContainer( ContainerInterface $container = null )
{
$this->container = $container;
}
答案 1 :(得分:13)
您可以将文件内容作为字符串加载,并使用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
}
}
答案 2 :(得分:0)
使用Doctrine Data-Fixtures回答Zend Framework 2.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', 'system@system.test');
$stmt->bindValue(':display_name', 'system');
$stmt->bindValue(':password', password );
$stmt->bindValue(':created_by', 1); // Self reference
$stmt->execute();
}