【问题标题】:Laravel running migrations on "app/database/migrations" folder recursivelyLaravel 在“app/database/migrations”文件夹上递归运行迁移
【发布时间】:2014-03-05 16:23:18
【问题描述】:

所以我的迁移文件夹看起来像这样,因为我有几十个表,它使事情保持井井有条:

migrations/
  create_user_table.php
  relations/
  translations/

我正在尝试刷新所有迁移和种子,但似乎我遇到了一个小问题,我不知道递归运行迁移的工匠命令(即在 relationstranslations 文件夹)。

我尝试添加--path="app/database/migrations/*",但它吐出了一个错误。有谁知道这个问题的解决方案吗?

【问题讨论】:

  • 在网上挖了一圈后,看起来不可能做到:github.com/laravel/framework/issues/2561
  • 为什么不对迁移进行排序/组织是件好事?
  • 函数 rei($folder) { $iterator = new DirectoryIterator($folder); system("php artisan migrate --path=" . $folder); foreach ($iterator as $fileinfo) { if ($fileinfo->isDir() && !$fileinfo->isDot()) { echo $fileinfo->getFilename() . "\n"; rei($folder . $fileinfo->getFilename() . '/'); } } } rei('./database/');

标签: php laravel database-migration


【解决方案1】:

现在唯一的方法是手动完成所有迁移。也就是说,您必须对每个子文件夹运行迁移命令:

php artisan migrate --path=/app/database/migrations/relations  
php artisan migrate --path=/app/database/migrations/translations

但是,您可以轻松地扩展 artisan 系统以编写您自己的迁移命令,该命令将遍历迁移文件夹下的所有文件夹,为您创建这些命令并运行它们。

如果您不想通过 artisan 进行此操作,也可以简单地编写一个 shell 脚本

编辑:对于 Laravel >= 5.0,在子目录中迁移迁移文件的正确命令是:

php artisan migrate --path=/database/migrations/relations
php artisan migrate --path=/database/migrations/translations

【讨论】:

  • 谢谢,我最终选择了脚本路线。
  • 这对我有帮助。尽管我很困惑,您将如何使用这种方式进行回滚?
  • php artisan migrate:rollback --path=migration/path
【解决方案2】:

这不是一个“直接”的解决方案,但我建议你在你的 laravel 项目中查看模块化。

模块可以将您的应用程序分割成几个较小的“文件夹”,并将迁移、种子、类、路由、控制器、命令放在易于维护的文件夹中。

这个包是一个好的开始:https://github.com/pingpong-labs/modules

【讨论】:

    【解决方案3】:

    在 Laravel 5 中,数据库文件夹默认位于 app 文件夹旁边。所以你可以运行这个来迁移单个文件夹迁移:

    php artisan migrate --path=/database/migrations/users
    

    【讨论】:

      【解决方案4】:

      一个简单的 Laravel 解决方案是创建一个 gulp 任务(比如migrate-others)。

      var elixir = require('laravel-elixir');
      var gulp = require('gulp');
      var shell = require('gulp-shell')
      
      /*
       |--------------------------------------------------------------------------
       | Elixir Asset Management
       |--------------------------------------------------------------------------
       |
       | Elixir provides a clean, fluent API for defining some basic Gulp tasks
       | for your Laravel application. By default, we are compiling the Sass
       | file for our application, as well as publishing vendor resources.
       |
       */
      
      elixir(function(mix) {
          mix.sass('app.scss');
      });
      
      // Our Task
      gulp.task('migrate-others', shell.task([
          'php artisan migrate --path=/app/database/migrations/relations',
          'php artisan migrate --path=/app/database/migrations/translations',
      ]));
      

      现在你可以简单地调用

      gulp migrate-others
      

      【讨论】:

      【解决方案5】:

      给你!

       function rei($folder)
          {
              $iterator = new DirectoryIterator($folder);
              system("php artisan migrate --path=" . $folder);
              foreach ($iterator as $fileinfo) {
                  if ($fileinfo->isDir() && !$fileinfo->isDot()) {
                      echo $fileinfo->getFilename() . "\n";
                      rei($folder . $fileinfo->getFilename() . '/');
                  }
              }
          }
      
       rei('./database/');
      

      【讨论】:

        【解决方案6】:

        您也可以使用通配符,如下所示:

        php artisan migrate --path=/database/migrations/*
        

        【讨论】:

          【解决方案7】:

          这添加到 AppServiceProvider

          中的 boot 方法
          $mainPath = database_path('migrations');
          $directories = glob($mainPath . '/*' , GLOB_ONLYDIR);
          $paths = array_merge([$mainPath], $directories);
          
          $this->loadMigrationsFrom($paths);
          

          现在你可以使用php artisan migratephp artisan migrate:back

          【讨论】:

          • 这是一个非常快速简单的解决方案。不必再考虑它,也不必有不同的 bash 脚本......只需将您的迁移放在子文件夹中并运行。
          • $this 应该是批准的答案 path 参数只是一种解决方法:)
          • 会不会出现迁移文件没有按顺序调用的情况?图片你有 subfolder1/2018-10.phpsubfolder1/2018-12.php 和 ``subfolder2/2018-11.php. WIll the migration files stil be called as 2018-10, 2018-11` 和 2018-12?
          • @Adam - 我刚刚在 Laravel 5.4 上尝试过,它根据文件名按顺序排列文件。因此,无论它们来自哪个目录,它都会根据文件名(即2020_07_22_create....)运行它们。
          • @turtlechief 是的,我也有同样的经历
          【解决方案8】:

          我重写了 MigrationServiceProvider:

          - registerResetCommand()
          - registerStatusCommand()
          - registerMigrateCommand()
          

          在那里你可以注册你自己的命令:

          class MigrateCommand extends Illuminate\Database\Console\Migrations\MigrateCommand
          

          之后你只需要扩展你的目录:

          protected function getMigrationPaths()
          

          或者您只是在应用程序启动时注册路径。 在我知道“$this->loadMigrationsFrom”之前,我已经完成了我的解决方案。

          【讨论】:

            【解决方案9】:

            一个简单的解决方案是创建一个 Artisan 命令,例如 (migrate:all),

            然后在句柄函数中为每个子目录定义迁移命令,如下所述。

            Artisan::call('migrate', [
               '--path' => '/database/migrations/employee'
            ]);
            

            【讨论】:

              【解决方案10】:

              您可以使用以下命令递归地执行此操作:

              php artisan migrate --path=/database/migrations/**/*
              

              **/* 也称为globstar

              在此工作之前,您必须检查您的 bash 是否支持 globstar。 您可以通过执行shopt 并检查globstar 来做到这一点。

              大多数服务器发行版默认支持 Globstar,但可能不适用于 MAC。

              有关 globstar 的更多信息,请参阅:https://www.linuxjournal.com/content/globstar-new-bash-globbing-option

              【讨论】:

              • 经过测试,它不起作用。只是给出一个找不到路径的错误。
              • @MichaelRyanSoileau 我们已经在生产环境中运行了 2 年,到底什么不适合您?你用的是什么系统?
              • 在 mac 上运行 PHP 7.3,Laravel 版本 5.5。每次我尝试这样做时,它都是无操作的。 :(
              • 好吧,我做了一些研究,结果表明 Mac 的 bash 不支持开箱即用的 globstar (apple.stackexchange.com/questions/291287/…)。我自己正在运行宅基地/流浪者并在虚拟框中使用终端。但是,如果您使用的是 Mac 的终端 globstar,则本机不支持。我将相应地编辑我的答案
              • 啊,解释完了。感谢您的尽职调查。
              【解决方案11】:

              只有相对路径对我有用(在 Laravel 5.7 中):

              php artisan migrate --path=database/migrations/your-folder-with-migrations
              

              【讨论】:

                【解决方案12】:

                你可以试试这个包nscreed/laravel-migration-paths。默认情况下,migrations 文件夹内的所有子目录 将被自动加载。即使您可以非常轻松地添加任何目录。

                'paths' => [
                    database_path('migrations'),
                    'path/to/custom_migrations', // Your Custom Migration Directory
                ],
                

                不需要任何特殊命令,只需通用:php artisan migrate 即可完成您的任务。

                【讨论】:

                • 这是一个不错的包,我正在我当前的项目中使用它。如果您添加了黑名单功能会更好。在我目前的项目中,我真的不需要它。然而,在研究这个功能时,我遇到了对 Laravel 的拒绝功能请求,其中一个原因是人们经常使用一个名为“存档”的子文件夹来存储旧的迁移文件。您可能还希望默认将其列入黑名单。否则,感谢您的出色工作
                • 感谢您的建议。 :-)
                【解决方案13】:

                这适用于 laravel 8

                php artisan migrate --path=database/migrations/tenant

                【讨论】:

                  【解决方案14】:

                  无需更改,只要您需要,请使用以下命令:

                  php artisan migrate --path=database/migrations/*
                  

                  如果你想要一个快捷方式,你可以在你的 composer.json 中包含它:

                  "scripts": {
                  
                      "migrate": [
                          "@php artisan migrate --force --path=database/migrations/*"
                      ]
                  }
                  

                  然后在终端中使用composer migrate

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2018-02-06
                    • 2020-01-07
                    • 1970-01-01
                    • 2016-05-25
                    • 2017-08-05
                    • 2021-04-04
                    • 2019-01-21
                    • 1970-01-01
                    相关资源
                    最近更新 更多