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?
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
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
Vous pouvez également utiliser un caractère générique, comme ceci:
php artisan migrate --path=/database/migrations/*
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
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
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
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
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'
]);
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/');
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».
Seul le chemin relatif fonctionne pour moi (dans Laravel 5.7):
php artisan migrate --path=database/migrations/your-folder-with-migrations