Php Doctrine2迁移向下迁移并从浏览器迁移,而不是从命令行迁移

Php Doctrine2迁移向下迁移并从浏览器迁移,而不是从命令行迁移,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我正在使用Doctrine2迁移。我需要一些关于我的疑问的答案,我无法在文档中找到一个好的解决方案 我使用: doctrine migrations:diff // generate migrations files doctrine migrations:migrate // migrates up to new version 如何向下迁移?指定以前的版本不起作用(没有任何更新说明f.e.条令迁移:迁移版本20120211163332说明 Migrating up to Versi

我正在使用Doctrine2迁移。我需要一些关于我的疑问的答案,我无法在文档中找到一个好的解决方案

我使用:

  doctrine migrations:diff // generate migrations files
  doctrine migrations:migrate // migrates up to new version
  • 如何向下迁移?指定以前的版本不起作用(没有任何更新说明f.e.条令迁移:迁移版本20120211163332说明

    Migrating up to Version20120211163332 from 20120309112058
    
    [Doctrine\DBAL\Migrations\MigrationException]  
    Could not find any migrations to execute.      
    
    但它不是向上的,它应该是向下的!您也可以在版本上看到响应

  • 如果我必须进行一些数据库更新,是否可以添加一些SQL查询(更改一些与其他相关的数据)?由于关闭不起作用,我还没有尝试:((

  • 有什么方法可以在浏览器外壳中使用migrate命令吗?我在共享主机中有软件,没有控制台访问权限,因此我需要此功能,而不是在phpMyAdmin中逐个复制查询:D


  • 我在Symfony的网站上看到了这个文件:

    有一个
    原则:migrations:execute
    允许您手动向上或向下执行单个迁移版本…但从未尝试过,对不起

    希望这有帮助


    请随时通知我们。

    您可以选择手动指定要迁移到的版本:

     php doctrine.php migrations:migrate YYYYMMDDHHMMSS
    
    或者执行上/下迁移

    php doctrine.php migrations:execute YYYYMMDDHHMMSS  --down
    php doctrine.php migrations:execute YYYYMMDDHHMMSS  --up
    
    您可以使用以下方法找到yyyymmddhhmms:

    php doctrine.php migrations:status
    >> Current Version:           2012-12-20 23:38:47 (20121220233847)
    >> Latest Version:            2012-12-20 23:38:47 (20121220233847)
    

    以下是如何从浏览器运行迁移:

    composer.json

    {
        "require": {
            "doctrine/dbal": "*",
            "doctrine/migrations": "dev-master"
        },
        "minimum-stability": "dev",
        "autoload": {
            "psr-0": {"": "src/"}
        }
    }
    
    src/Acme/Migrations/Version1.php

    <?php # src/Acme/Migrations/Version1.php
    namespace Acme\Migrations;
    
    use Doctrine\DBAL\Migrations\AbstractMigration;
    use Doctrine\DBAL\Schema\Schema;
    
    /**
     * Class Version1
     *
     * Notice that file and class names MUST be Version*.php
     *
     * @package Acme\Migrations
     */
    class Version1 extends AbstractMigration
    {
        public function up(Schema $schema)
        {
            $users = $schema->createTable('users');
            $users->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true));
            $users->addColumn('username', 'string', array('length' => 128));
            $users->addColumn('password', 'string', array('length' => 128));
            $users->setPrimaryKey(array('id'));
    
            // You can also add any queries
            // $this->addSql('CREATE TABLE addresses (id INT NOT NULL, street VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB');
        }
    
        public function down(Schema $schema)
        {
            $schema->dropTable('users');
    
            //$this->addSql('DROP TABLE addresses');
        }
    
        // Use this functions to prepare your migrations
        //public function preUp(Schema $schema) {}
        //public function postUp(Schema $schema) {}
        //public function preDown(Schema $schema) {}
        //public function postDown(Schema $schema) {}
    }
    
    <?php # index.php
    use Doctrine\DBAL\DriverManager;
    use Doctrine\DBAL\Migrations\Configuration\Configuration;
    use Doctrine\DBAL\Migrations\Migration;
    use Doctrine\DBAL\Migrations\OutputWriter;
    
    require_once 'vendor/autoload.php';
    
    $nl = PHP_SAPI == 'cli' ? PHP_EOL : '<br>'; // Optional will be used for output
    
    $to = null; // Optional integer - migrate to version, if null - will migrate to latest available version
    #region Optional get argument
    $index = PHP_SAPI == 'cli' ? 1 : 'to';
    $arguments = PHP_SAPI == 'cli' ? $argv : $_REQUEST;
    $to = isset($arguments[$index]) && filter_var($arguments[$index], FILTER_VALIDATE_INT) ? intval($arguments[$index]) : null;
    #endregion
    
    #region Doctrine Connection
    // Silex: $app['db']
    // Symfony controller: $this->get('database_connection')
    $db = DriverManager::getConnection(array(
        'dbname' => 'doctine_migrations',
        'user' => 'root',
        'password' => 'root',
        'host' => 'localhost',
        'driver' => 'pdo_mysql',
        'charset' => 'utf8',
        'driverOptions' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
        )
    ));
    #endregion
    
    #region Config
    $config = new Configuration($db /*, new OutputWriter(function ($message) { echo $message . PHP_EOL; })*/); // OutputWriter is optional and by default do nothing, accepts closure for writing logs
    
    //$config->setName('My Migrations'); // Optional name for your migrations
    $config->setMigrationsTableName('version'); // Table name that will store migrations log (will be created automatically, default name is: doctrine_migration_versions)
    $config->setMigrationsNamespace('Acme\\Migrations'); // Namespace of your migration classes, do not forget escape slashes, do not add last slash
    $config->setMigrationsDirectory('src/Acme/Migrations'); // Directory where your migrations are located
    $config->registerMigrationsFromDirectory($config->getMigrationsDirectory()); // Load your migrations
    #endregion
    
    $migration = new Migration($config); // Create Migration based on provided configuration
    
    $versions = $migration->getSql($to); // Retrieve SQL queries that should be run to migrate you schema to $to version, if $to == null - schema will be migrated to latest version
    
    #region Some dummy output
    foreach ($versions as $version => $queries) {
        echo 'VERSION: ' . $version . $nl;
        echo '----------------------------------------------' . $nl . $nl;
    
        foreach ($queries as $query) {
            echo $query . $nl . $nl;
        }
    
        echo $nl . $nl;
    }
    #endregion
    
    try {
        $migration->migrate($to); // Execute migration!
        echo 'DONE' . $nl;
    } catch (Exception $ex) {
        echo 'ERROR: ' . $ex->getMessage() . $nl;
    }
    

    如果要向下迁移1步,可以使用以下语法:

    ./doctrine migrations:migrate prev
    
    要转到第一次迁移,请执行以下操作:

    ./doctrine migrations:migrate first
    
    ./doctrine migrations:migrate next
    
    要转到下一次迁移,请执行以下操作:

    ./doctrine migrations:migrate first
    
    ./doctrine migrations:migrate next
    

    来源:

    在我的例子中,它如下所示:

    恢复更改:

    php bin/console原则:迁移:执行“VendorName\ProjectName\Account\migrations\Version20201002092643”--向下

    处理迁移:

    ./doctrine migrations:migrate first
    
    ./doctrine migrations:migrate next
    
    php bin/console原则:迁移:执行“VendorName\ProjectName\Account\migrations\Version20201002092643”--up

    或者只是

    php bin/console原则:迁移:执行“VendorName\ProjectName\Account\migrations\Version20201002092643”

    我的Symfony迁移配置如下所示:

    doctrine_migrations:
        migrations_paths:
            # namespace is arbitrary but should be different from App\Migrations
            # as migrations classes should NOT be autoloaded
            'DoctrineMigrations': '%kernel.project_dir%/migrations'
            'VendorName\ProjectName\Account\Migrations': '%kernel.project_dir%/component/account/migrations'
    

    谢谢你的回复,我保留了你的答案,至少你已经尝试过了!!是的,我已经阅读了文档(也是在写问题之前)。如果上升没有问题,但下降是一场噩梦。还请注意,如果您与Subversion团队合作,最好忽略迁移文件夹,并在每次刷新工作副本时使用“原则:迁移:最新”来获取最新版本,然后再“执行--关闭”命令。使事情变得更简单。这一点很正确。正如其他人所说,这并不困难,最困难的事情是从文件名中复制日期戳!对于使用symfony的人,只需调用应用程序/控制台原则:迁移:执行YYYYMMDDHHMMSS--down,此外,您还可以传递实体管理器(em)参数,如果您的doctor.yaml有多个ems设置。
    php-bin/console-doctor:migrations:execute 20180409085702--down--em=customer
    。使用特定数字down执行没有迁移最新版本。我希望当您给出要迁移的版本时,它会先运行最新的迁移,然后再运行最新的迁移t、 诸如此类。非常感谢,愚蠢的官方文档没有提到回滚,即使在2019年的Symfony 4中也是如此……从3.0+开始,你需要写FQCN,而不是数字。Docs:我浏览了整个条令迁移包,然后无意中发现了你关于堆栈溢出的帖子。基于此,我想出了四行代码-代码解决方案。谢谢你,好心的先生!当我使用prev时,它后退了两步。这是我在symfony 5.3上使用的解决方案。官方文档确实需要添加此内容。谢谢。从3.0+开始,你需要编写FQCN,而不是数字。文档: