Laravel запускает миграцию в папке "приложение/база данных/миграции" рекурсивно

Итак, папка моих миграций выглядит так, потому что у меня есть десятки таблиц, которые хранят вещи организованными и чистыми:

migrations/
  create_user_table.php
  relations/
  translations/

Я пытаюсь обновить все миграции и семплы, но похоже, что я столкнулся с небольшим сбоем, когда я не знаю, что команда artisan для ретрансляции миграции (т.е. выполняется миграция в relations и translations).

Я попробовал добавить --path="app/database/migrations/*", но он выплюнул ошибку. Кто-нибудь знает решение этого?

Ответ 1

Единственный способ сделать это прямо сейчас - это вручную пройти все миграции. То есть вы должны запустить команду миграции в каждой из ваших подпапок:

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

Однако то, что вы можете сделать, это легко расширить систему ремесленников, чтобы написать собственную команду migrate, которая будет выполнять итерацию по всем папкам в папке миграции, создаст эти команды для вас и запустит их.

Вы также можете просто написать оболочку script, если вы не хотите заниматься этим через artisan

Изменить: для Laravel >= 5.0 правильные команды для переноса файлов миграции в подкаталогах:

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

Ответ 2

Это добавляет метод boot в AppServiceProvider

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

$this->loadMigrationsFrom($paths);

Теперь вы можете использовать php artisan migrate, а также php artisan migrate:back

Ответ 3

Вы также можете использовать подстановочный знак, например:

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

Ответ 4

В Laravel 5 папка базы данных по умолчанию находится рядом с папкой приложения. Таким образом, вы можете запустить это, чтобы перенести миграции одиночных папок:

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

Ответ 5

Вы можете использовать следующую команду, чтобы сделать это рекурсивно:

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

**/* также известен как globstar

Прежде чем это сработает, вы должны проверить, поддерживает ли ваш bash глобстар. Вы можете сделать это, выполнив shopt и проверив наличие globstar.

Globstar по умолчанию поддерживается большинством серверных дистрибутивов, но может не работать на MAC.

Для получения дополнительной информации о Globstar см.: https://www.linuxjournal.com/content/globstar-new-bash-globbing-option

Ответ 6

Вы можете попробовать этот пакет nscreed/laravel -igration-paths. По умолчанию все подкаталоги внутри папки миграции будут автоматически загружены. Даже вы можете легко добавлять любые каталоги.

'paths' => [
    database_path('migrations'),
    'path/to/custom_migrations', // Your Custom Migration Directory
],

Не нужно никаких специальных команд, только общая: php artisan migrate выполнит ваши задачи.

Ответ 7

Это не "прямое" решение, но я предлагаю вам взглянуть на модульность в ваш проект laravel.

Модули могут сегментировать ваше приложение в нескольких небольших "папках" и переносить миграции, семена, классы, маршруты, контроллеры, команды вместе в легко поддерживаемые папки.

Этот пакет является хорошим началом: https://github.com/pingpong-labs/modules

Ответ 8

Простым решением 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

Ответ 9

Здесь вы идете!

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

Ответ 10

Я переписал MigrationServiceProvider:

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

Здесь вы можете зарегистрировать свои собственные команды:

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

После этого вам просто нужно расширить каталоги youd:

protected function getMigrationPaths()

Или вы просто регистрируете пути при загрузке приложения. Я уже сделал свое решение, прежде чем я оговорился о '$ this- > loadMigrationsFrom'.

Ответ 11

Простое решение состоит в том, чтобы создать команду Artisan Command (migrate: all),

то внутренняя функция дескриптора определяет команду migrate для каждого подкаталога, как указано ниже.

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

Ответ 12

У меня работает только относительный путь (в Laravel 5.7):

php artisan migrate --path=database/migrations/your-folder-with-migrations