Laravel 在“app/database/migrations”文件夹上递归运行迁移

Posted

技术标签:

【中文标题】Laravel 在“app/database/migrations”文件夹上递归运行迁移【英文标题】:Laravel running migrations on "app/database/migrations" folder recursively 【发布时间】: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/'); 【参考方案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/relationsphp 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

【讨论】:

当我使用这个命令时,它们显示错误 --"'gulp' 未被识别为内部或外部命令," @Vipul:安装 gulp(通过 npm install --global gulp)并重试。更多信息在这里.. laravel.com/docs/5.0/elixir 在你的 composer.json 中执行此操作 getcomposer.org/doc/articles/scripts.md#defining-scripts【参考方案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

【讨论】:

以上是关于Laravel 在“app/database/migrations”文件夹上递归运行迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上通过 Laravel Installer 安装 Laravel?

在 Mac 上安装 Laravel 会抛出 laravel,即使在设置 PATH 后也找不到

Laravel 在控制器中使用非 Laravel Composer 包

如何在 Laravel 8 中使用 srmklive/laravel-paypal v3

laravel怎么在中间表插入数据

在 laravel 中创建一个下拉列表来选择用户角色 - laravel