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

     2023-03-14     48

关键词:

【中文标题】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

【讨论】:

在 Windows 上无法通过 Laravel 安装程序安装 Laravel 4.2?

】在Windows上无法通过Laravel安装程序安装Laravel4.2?【英文标题】:InstallingLaravel4.2viaLaravelinstallernotpossibleonwindows?【发布时间】:2015-04-0713:43:09【问题描述】:通过laravel安装程序在Windows上安装laravel时,使用命令composerglobalrequire&qu... 查看详情

在 laravel 项目中运行“laravel new”命令

】在laravel项目中运行“laravelnew”命令【英文标题】:Running"laravelnew"commandinlaravelproject【发布时间】:2019-12-2912:17:04【问题描述】:我不小心在一个laravel项目中运行了laravelnew命令,显然删除了autoload_real.php我在运行phpartis... 查看详情

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

】如何在Windows上通过LaravelInstaller安装Laravel?【英文标题】:HowtoinstallLaravelviaLaravelInstalleronWindows?【发布时间】:2014-12-1413:57:42【问题描述】:我正在尝试使用LaravelInstaller方法在Windows上安装Laravel框架。在thedocumentation我发现了... 查看详情

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

】在Mac上安装Laravel会抛出laravel,即使在设置PATH后也找不到【英文标题】:LaravelinstallationonamacthrowslaravelnotfoundevenaftersettingthePATH【发布时间】:2015-06-0215:19:18【问题描述】:我正在尝试使用laravel.com安装页面上提到的作曲家在Mac... 查看详情

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

】Laravel在控制器中使用非LaravelComposer包【英文标题】:Laravelusenon-laravelcomposerpackageincontroller【发布时间】:2015-05-2303:41:36【问题描述】:我正在尝试在Laravel控制器中使用非laravel作曲家包。我已将项目添加到composer.json文件中,... 查看详情

Laravel 如何在会话 Laravel 中存储额外的数据/值

】Laravel如何在会话Laravel中存储额外的数据/值【英文标题】:LaravelHowtostoreextradata/valueinsessionLaravel【发布时间】:2016-10-0212:15:00【问题描述】:我在laravel登录中使用默认auth()(电子邮件和密码)现在我尝试在(年龄或城市)等... 查看详情

在 Laravel 4 上使用非 laravel 包

】在Laravel4上使用非laravel包【英文标题】:Usinganon-laravelpackageonLaravel4【发布时间】:2013-02-1721:42:25【问题描述】:是否可以在框架中包含不是专门为L4设计的包?如果是这样,它是如何完成的?我知道我需要将包添加到我的compos... 查看详情

Laravel:如何在 Laravel 中找到公用文件夹?

】Laravel:如何在Laravel中找到公用文件夹?【英文标题】:Laravel:HowtolocatedpublicfolderinLaravel?【发布时间】:2020-09-1406:32:34【问题描述】:所以我使用它来将我的图像保存在文件fylesystems.php中并且它可以工作,但是现在我想部署我... 查看详情

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

】在laravel中创建一个下拉列表来选择用户角色-laravel【英文标题】:Creatingadropdownlistinlaraveltoselectausersrole-laravel【发布时间】:2020-06-0621:30:44【问题描述】:我正在使用laravel创建一个网站,我有一个创建新用户的表单,在其中我... 查看详情

为啥在 RegisterController 中创建函数在 laravel 中不起作用

】为啥在RegisterController中创建函数在laravel中不起作用【英文标题】:WhycreatefunctioninRegisterControllerisnotworkinginlaravel为什么在RegisterController中创建函数在laravel中不起作用【发布时间】:2021-12-0311:00:27【问题描述】:我是Laravel的新... 查看详情

Laravel - 在数据库中保存或插入图像数组 - Laravel

】Laravel-在数据库中保存或插入图像数组-Laravel【英文标题】:Laravel-SavingorInsertingArrayofImagesinDatabase-Laravel【发布时间】:2019-04-2111:17:21【问题描述】:我想将我的图像保存在我使用数组的数据库mysql上,我可以插入一些东西,但... 查看详情

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

】如何在Laravel8中使用srmklive/laravel-paypalv3【英文标题】:Howtousesrmklive/laravel-paypalv3inLaravel8【发布时间】:2021-06-1022:46:27【问题描述】:我在laravel项目中使用srmklive/laravel-paypalv.3包(https://github.com/srmklive/laravel-paypal没有文档)。... 查看详情

Laravel 通过使用多态关系在 Laravel 中查询(函数 find() )

】Laravel通过使用多态关系在Laravel中查询(函数find())【英文标题】:Laravelqueries(functionfind())inLaravelthroughtusingpolymorphicralationship【发布时间】:2020-12-0110:01:21【问题描述】:我是Laravel的新手,对通过使用多态关系进行LaravelSQL查... 查看详情

如何在laravel中删除公共文件夹

】如何在laravel中删除公共文件夹【英文标题】:howtoremovefolderpublicinlaravel【发布时间】:2014-03-2410:12:41【问题描述】:我在位于http://localhost/laravel的xampp上设置了laravel但要测试它,我必须去localhost/laravel/public我如何摆脱/public?... 查看详情

使用 nginx 在 laravel forge 上集成 Laravel 5.2 wordpress

】使用nginx在laravelforge上集成Laravel5.2wordpress【英文标题】:Laravel5.2wordpressintegrationonlaravelforgeusingnginx【发布时间】:2016-07-2112:00:38【问题描述】:我有一个在laravelforge上构建和托管的laravel5.2网络应用程序。到目前为止没问题,... 查看详情

Laravel:在迁移之前删除迁移:重置

】Laravel:在迁移之前删除迁移:重置【英文标题】:Laravel:Deletemigrationbeforemigrate:reset【发布时间】:2017-09-0320:27:48【问题描述】:我是Laravel的新手。我正在尝试使用以下命令重置数据库中的所有表:phpartisan迁移:重置不幸的是... 查看详情

如何在 laravel 中实现 vuetify?

】如何在laravel中实现vuetify?【英文标题】:Howtoimplementvuetifyinlaravel?【发布时间】:2018-07-2123:32:58【问题描述】:我是vuetify的新手,我试图在laravel中实现它。有人已经在laravel中实现了vuetify,可以告诉我怎么做吗?我已经安装... 查看详情

Laravel - 如何在本地开发中使用 https 服务 laravel 项目

】Laravel-如何在本地开发中使用https服务laravel项目【英文标题】:Laravel-howtoservelaravelprojectwithhttpsonlocaldevelopment【发布时间】:2021-02-1503:17:49【问题描述】:我在Google上搜索了很多关于使用https服务的解决方案。即使我尝试了ngrok... 查看详情