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