web-dev-qa-db-fra.com

Laravel Migration en cours sur le dossier "app/database/migrations" de manière récursive

Donc, mon dossier de migration ressemble à ceci puisque j'ai des dizaines de tables, cela garde les choses organisées et nettes:

migrations/
  create_user_table.php
  relations/
  translations/

J'essaie de rafraîchir toutes les migrations et les valeurs d'origine, mais il semble que j'ai rencontré un léger hic, où je ne connais pas la commande artisan permettant d'exécuter les migrations de manière récursive (par exemple, les migrations dans les dossiers relations et translations .

J'ai essayé d'ajouter --path="app/database/migrations/*" mais il a craché une erreur. Est-ce que quelqu'un connaît la solution à cela?

15
tiffanyhwang

La seule façon de le faire maintenant consiste à effectuer manuellement toutes les migrations. Autrement dit, vous devez exécuter la commande de migration sur chacun de vos sous-dossiers:

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

Cependant, vous pouvez facilement étendre le système artisan pour écrire votre propre commande migrate qui parcourra tous les dossiers du dossier de migration, créer ces commandes pour vous et les exécuter. 

Vous pouvez aussi simplement écrire un script Shell si vous ne voulez pas le faire par le biais de

Edit: for Laravel> = 5.0, les commandes appropriées pour migrer les fichiers de migration dans les sous-répertoires sont les suivantes:

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

31

Cette addition à boot method dans AppServiceProvider

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

$this->loadMigrationsFrom($paths);

Maintenant vous utilisez peut php artisan migrate et aussi php artisan migrate:back

11
Vinco Velky

Vous pouvez également utiliser un caractère générique, comme ceci:

php artisan migrate --path=/database/migrations/*
10
David Driessen

Dans Laravel 5, le dossier de la base de données est situé à côté du dossier de l'application par défaut. Vous pouvez donc exécuter ceci pour migrer une migration de dossiers unique:

php artisan migrate --path=/database/migrations/users
2
Sam Deering

Vous pouvez utiliser la commande suivante pour le faire de manière récursive:

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

**/* est également connu sous le nom globstar

Avant que cela fonctionne, vous devez vérifier si votre bash prend en charge le globstar. Vous pouvez le faire en exécutant shopt et en vérifiant globstar.

Globstar est pris en charge par défaut par la plupart des distributions de serveur mais peut ne pas fonctionner sur MAC.

Pour plus d'informations sur globstar, voir: https://www.linuxjournal.com/content/globstar-new-bash-globbing-option

1
Mazzy

Ce n'est pas une solution "directe" mais je vous suggère de regarder Modularity dans votre projet Laravel.

Les modules peuvent segmenter votre application en plusieurs "dossiers" plus petits et rassembler la migration, les semences, les classes, les itinéraires, les contrôleurs et les commandes dans des dossiers faciles à gérer.

Ce paquet est un bon début: https://github.com/pingpong-labs/modules

1
Ifnot

Une solution simple Laravel consiste à créer une tâche gulp (disons 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',
]));

Maintenant, vous pouvez simplement appeler

gulp migrate-others
0
shahalpk

Une solution simple consiste à créer une commande artisanale par exemple (migrate: all),

ensuite, dans la fonction handle, définissez la commande migrate pour chaque sous-répertoire, comme indiqué ci-dessous.

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

Voici! 

 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/');
0
Carlos Arturo Alaniz

J'ai réécrit le MigrationServiceProvider:

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

Là, vous pouvez enregistrer vos propres commandes:

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

Après cela, il vous suffit d’étendre les répertoires youd:

protected function getMigrationPaths()

Ou bien vous enregistrez simplement les chemins au démarrage de l'application. J'ai déjà fait ma solution avant de connaître «$ this-> loadMigrationsFrom».

0
Sphinxila

Seul le chemin relatif fonctionne pour moi (dans Laravel 5.7):

php artisan migrate --path=database/migrations/your-folder-with-migrations
0
Štefan Ondáš