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/
我正在尝试刷新所有迁移和种子,但似乎我遇到了一个小问题,我不知道递归运行迁移的工匠命令(即在 relations
和translations
文件夹)。
我尝试添加--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/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
【讨论】:
当我使用这个命令时,它们显示错误 --"'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 migrate
和php artisan migrate:back
【讨论】:
这是一个非常快速简单的解决方案。不必再考虑它,也不必有不同的 bash 脚本......只需将您的迁移放在子文件夹中并运行。 $this 应该是批准的答案path
参数只是一种解决方法:)
会不会出现迁移文件没有按顺序调用的情况?图片你有 subfolder1/2018-10.php
, subfolder1/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 包