2014-02-08 100 views
6

所以我迁移文件夹是这样的,因为我有几十它使组织和清洁用品表:Laravel运行的“应用/数据库/迁移”文件夹迁移递归

migrations/ 
    create_user_table.php 
    relations/ 
    translations/ 

我试图做一个刷新所有的迁移和种子,但似乎我遇到了轻微的打嗝,我不知道artisan命令递归运行迁移(即在relationstranslations文件夹中运行迁移)。

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

+0

各地的网络挖掘后,看起来这是不可能的事:https://github.com/laravel/framework/issues/2561 – tiffanyhwang

+0

有,为什么不选的理由/组织你的迁移是一件好事? – tiffanyhwang

+0

函数rei($文件夹) { $ 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 /'); –

回答

22

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

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

但是,你可以做什么是很容易的扩展工匠系统编写自己的迁移命令将通过迁移下的所有文件夹重复文件夹,为你创建这些命令并运行它们。

你也可以简单的写一个shell脚本,如果你不想要进入通过工匠做这个

编辑:为Laravel> = 5.0,正确的命令迁移文件迁移中的子目录会:

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

+0

谢谢,我结束了脚本路线。 – tiffanyhwang

+0

这帮了我。虽然我很困惑,你会如何用这种方式回滚? –

1

这是一个没有“直接”的解决方案,但我建议你看一下模块化到您的laravel项目。

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

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

1

在Laravel 5数据库文件夹坐在旁边默认应用程序文件夹中。所以,你可以运行这个迁移单个文件夹迁移:

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

一个简单的Laravel解决方案是创建一个任务,一饮而尽(比如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 
+0

当我使用这个命令时,他们显示错误 - “'gulp'不被识别为内部或外部命令,” – Vipul

+0

@Vipul:安装gulp(通过'npm install --global gulp')并重试。更多信息在这里.. https://laravel.com/docs/5.0/elixir – shahalpk

0

在这里你去!

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/'); 
7

您也可以使用通配符,像这样:

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

这增加启动方法AppServiceProvider

$mainPath = database_path('migrations');ň 
$directories = glob($mainPath . '/*' , GLOB_ONLYDIR); 
$paths = array_merge([$mainPath], $directories); 

$this->loadMigrationsFrom($paths); 

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

0

我改写了MigrationServiceProvider:

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

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

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

之后,你只需要扩展你几乎目录:

protected function getMigrationPaths() 

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

0

一个简单的解决方案是创建一个工匠命令例如(迁移:所有),

然后手柄函数内部定义为波纹管提到的每个子目录迁移命令。

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