Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Symfony2在加载中执行SQL文件_Mysql_Sql_Symfony_Doctrine Orm_Fixtures - Fatal编程技术网

Mysql Symfony2在加载中执行SQL文件

Mysql Symfony2在加载中执行SQL文件,mysql,sql,symfony,doctrine-orm,fixtures,Mysql,Sql,Symfony,Doctrine Orm,Fixtures,我正在将一个基于SQL Server和ASP的旧web应用程序迁移到Symfony2和MySQL。我进行了一些查询,并将旧数据导出到单个SQL文件中。 当我运行命令时,如何在我的装置中执行这些文件 $php app/console doctrine:fixtures:load 现在,我有一些装置可以直接与ORM和实体一起工作,但我有很多数据要导入。您可以将文件内容作为字符串加载,并使用EntityManager执行本机SQL: class SQLFixtures extends Abstrac

我正在将一个基于SQL Server和ASP的旧web应用程序迁移到Symfony2和MySQL。我进行了一些查询,并将旧数据导出到单个SQL文件中。 当我运行命令时,如何在我的装置中执行这些文件

$php app/console doctrine:fixtures:load

现在,我有一些装置可以直接与ORM和实体一起工作,但我有很多数据要导入。

您可以将文件内容作为字符串加载,并使用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
  }
}

我找到了一个好办法。我在类
ObjectManager
中未找到
exec
方法,因此。。。这对我来说很管用

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类必须使用以下方法实现
ContainerWareInterface

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

回答Zend Framework 2.5.3使用的问题

不确定这是否适用于给定的答案,但他们尝试得有点太努力了。如果检查给定的
$manager
对象,您会发现它已经是
EntityManager
(属于
接口ObjectManager
)(至少在ZF2中)。因此,您可以直接获取
连接
,并且可以在不使用
$this->container->get('doctrine.orm.entity\u 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();
}

使用Symfony\Component\Finder\Finder;我们可以使用
new\Symfony\Component\Finder\SplFileInfo('web/sql/categories.sql','','')
代替
Finder
在ObjectManager下没有方法
getConnection
。我的孩子向我尖叫。代码运行是因为我没有对象管理器。我找了一个实体经理。。。。。。。