2014-02-08 14 views
6

So Ordner wie folgt aussieht, da ich Dutzende von Tabellen haben es Dinge organisiert und sauber hält:Laravel meine Migrationen laufen Migrationen auf „app/database/Migrationen“ Ordner rekursiv

migrations/ 
    create_user_table.php 
    relations/ 
    translations/ 

Ich versuche, eine zu tun Aktualisieren Sie alle Migrationen und Seeds, aber es scheint, als wäre ich in einen leichten Schluckauf geraten, wo ich den Handwerkerbefehl nicht kenne, um Migrationen rekursiv auszuführen (dh Migrationen auch in den Ordnern relations und translations auszuführen).

Ich habe versucht, hinzufügen, aber es spuckte einen Fehler aus. Kennt jemand die Lösung dafür?

+0

Nach rund um das Web zu graben, wie sieht es zu tun ist unmöglich: https://github.com/laravel/framework/issues/2561 – tiffanyhwang

+0

Gibt es einen Grund, warum Ihre Migrationen nicht Sortieranlagen/Organisation ist eine gute Sache ? – tiffanyhwang

+0

Funktion rei ($ Ordner) { $ iterator = neuer DirectoryIterator ($ Ordner); System ("php artisan migrieren - Pfad =". $ Ordner); foreach ($ iterator als $ fileinfo) { if ($ fileinfo-> isDir() &&! $ Fileinfo-> isDot()) { echo $ fileinfo-> getFilename(). "\ n"; rei ($ ordner. $ Fileinfo-> getFilename(). '/'); } } } rei ('./ Datenbank /'); –

Antwort

22

Die einzige Möglichkeit, dies jetzt zu tun, besteht darin, alle Migrationen manuell durchzuführen. Das heißt, Sie haben den Migrationsbefehl auf jedem Ihrer Unterordner auszuführen:

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

Doch was können Sie tun ist, leicht die Handwerker-System erweitern Sie Ihren eigenen Migrate Befehl zu schreiben, die durch alle Ordner unter den Migrationen durchlaufen wird Ordner, erstellen Sie diese Befehle für Sie und führen Sie sie aus.

Sie können auch ein Shell-Skript schreiben Sie einfach, wenn Sie diese über bekommen wollen nicht Handwerker in tut

Edit: die richtigen Befehle für Laravel> = 5.0, würde Migrationsdateien in Unterverzeichnissen zu migrieren sein :

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

+0

Danke, ich bin am Ende der Drehbuchroute gelandet. – tiffanyhwang

+0

Das hat mir geholfen. Obwohl ich verwirrt bin, wie würdest du mit diesem Weg über Rollback gehen? –

1

Es ist eine nicht eine „direkte“ Lösung, aber ich schlage vor, Sie an Modularität in Ihr Laravel Projekt zu suchen.

Module können Ihre Anwendung in mehrere kleinere "Ordner" segmentieren und Migration, Seeds, Klassen, Routen, Controller, Befehle in leicht wartbaren Ordnern zusammenfassen.

Dieses Paket ist ein guter Anfang: https://github.com/pingpong-labs/modules

1

In Laravel 5 der Datenbank-Ordner neben dem App-Ordner standardmäßig sitzt. So könnte man diese betreiben eine einzelne Ordner Migration zu migrieren:

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

Eine einfache Laravel Lösung ist ein Schluck Aufgabe (zum Beispiel migrate-others) zu erstellen.

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', 
])); 

Jetzt können Sie einfach anrufen

gulp migrate-others 
+0

Wenn ich diesen Befehl benutze, wird der Fehler angezeigt - "'gulp' wird nicht als interner oder externer Befehl erkannt," – Vipul

+0

@Vipul: install gulp (über 'npm install --global gulp') und versuche es erneut. Mehr Infos hier .. https://laravel.com/docs/5.0/elixir – shahalpk

0

Hier gehen Sie!

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

Sie auch einen Platzhalter, wie so verwenden können:

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

können Sie

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

$this->loadMigrationsFrom($paths); 

Jetzt Dieses Add zu Boot Methode in AppServiceProvider php artisan migrate verwenden und php artisan migrate:back auch

0

schrieb ich die MigrationServiceProvider:

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

Dort können Sie Ihre eigenen Befehle registrieren:

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

Danach müssen Sie nur youd Verzeichnisse erweitern:

protected function getMigrationPaths() 

Oder Sie registrieren die Pfade beim Anwendungsstart. Ich habe meine Lösung schon gemacht, bevor ich über '$ this-> loadMigrationsFrom' wusste.

0

Eine einfache Lösung ist es, einen Artisan Befehl zum Beispiel (migrieren: alle) zu schaffen,

dann Innengriff Funktion migrieren für jedes Unterverzeichnis Befehl definieren, wie unten erwähnt.

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