Laravel 5 Laravel变更迁移顺序

Laravel 5 Laravel变更迁移顺序,laravel-5,migration,Laravel 5,Migration,有没有一种方法可以改变迁移顺序而不必全部重新创建它们?因为现在我的外键出了问题——(与laravel合作) (或者从一个新的数据库开始) 更改构成迁移文件名第一部分的日期,使其符合您想要的顺序(例如,对于2014\u 06\u 24\u 134109\u update\u database.php,日期和时间为2014-06-24,13:41:09) 再次运行迁移 关于你对外键的评论。。。我不确定问题出在拉威尔身上。更有可能的是,它只是MySQL 我避免使用外键,因为一旦获得了一组相当复杂

有没有一种方法可以改变迁移顺序而不必全部重新创建它们?因为现在我的外键出了问题——(与laravel合作)

  • (或者从一个新的数据库开始)

  • 更改构成迁移文件名第一部分的日期,使其符合您想要的顺序(例如,对于
    2014\u 06\u 24\u 134109\u update\u database.php
    ,日期和时间为2014-06-24,13:41:09)

  • 再次运行迁移

  • 关于你对外键的评论。。。我不确定问题出在拉威尔身上。更有可能的是,它只是MySQL


    我避免使用外键,因为一旦获得了一组相当复杂的关系,您就会像您所看到的那样,开始遇到数据库一致性问题—服务器很难确定创建表和关系的顺序,并且它开始在转储文件(用于备份)等方面造成困难.

    您必须创建一个可执行的自定义命令
    php artisan migrate:refresh--path=/database/migrations/name_migration.php
    以您想要的顺序重复迁移的名称

    像这样:

  • 使用以下命令创建命令类:
    php artisan make:Command NameClass
  • 转到
    app/Console/Commands/
    并找到类文件
    NameClass.php
  • 在NameClass.php中,有两个属性
    $signature
    (命令名称)和
    $description
    (有关命令功能的信息)
  • 设置命令的名称和说明。
    Ex:protected$signature='namecommand';protected$descripton='此方法按顺序迁移表'
  • 在NameClass.php中有一个名为
    handle()
    的方法,在这里您必须声明编写命令时要执行的代码
  • 注册你的命令。转到
    app/Console/Kernel.php并将您的类添加到命令类列表中。
    
    受保护的$commands=[
    命令\NameClass::class,
    ];
  • 在终端中写入命令<代码>php artisan名称命令
  • 例如:

  • php artisan make:command MigrateInoder

  • app/Console/Commands/migrateInoder.php

  • 执行命令

  • 您只需要更改迁移顺序。如果Band或stage表位于users表下方,MySQL将找不到引用。=)

    最好、最简单的方法就是重命名迁移名
    yyyy\u mm\u dd\u hhmmss\u migration\u name
    。如果您的迁移遵循此顺序,Laravel将确保以日期排序的形式运行迁移,

    这是一个很好的小技巧,挽救了我的一天。谢谢是的,这也是我的问题。谢谢:)您可以将每个表的迁移拆分为两个迁移文件,一个用于表创建,另一个用于表关系,并在所有创建迁移之后保留所有更新迁移的日期。这样在回滚和重新迁移时就不会出现问题。对laravel来说,在所有创建完成后运行外键定义不是一个完美的解决方案吗?这对laravel来说可能很好,但是我在外键定义方面看到的问题是使用诸如
    mysqldump
    之类的工具-如果您有一组表,它们之间有关系,
    mysqldump
    通常以无法成功重新导入的顺序将它们写出(例如,表a依赖于表B,表B依赖于表a)。也许近年来情况发生了变化,所以YMMV。
    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    
    class MigrateInOrder extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'migrate_in_order';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Execute the migrations in the order specified in the file app/Console/Comands/MigrateInOrder.php \n Drop all the table in db before execute the command.';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
           /** Specify the names of the migrations files in the order you want to 
            * loaded
            * $migrations =[ 
            *               'xxxx_xx_xx_000000_create_nameTable_table.php',
            *    ];
            */
            $migrations = [ 
                            '2020_04_18_005024_create_users_types.php',
                            '2014_10_12_000000_create_users_table.php',
                            '2014_10_12_100000_create_password_resets_table.php',
                            '2019_08_19_000000_create_failed_jobs_table.php'
            ];
    
            foreach($migrations as $migration)
            {
               $basePath = 'database/migrations/';          
               $migrationName = trim($migration);
               $path = $basePath.$migrationName;
               $this->call('migrate:refresh', [
                '--path' => $path ,            
               ]);
            }
        }
    } 
    
        protected $commands = [
            Commands\MigrateInOrder::class,
        ];
    
       php artisan migrate_in_order