Как запустить миграцию laravel и сеялку БД, кроме одной

У меня много файлов миграции и сеансов, хотя мне нужно будет запустить все файлы, но в настоящее время мне нужно пропустить одну миграцию и сеялку.

Как я могу пропустить один файл из миграции laravel и команды db seeder.

Я не хочу удалять файлы из папки миграций или семян, чтобы пропустить файл.

11

Решение

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

class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(ExampleTableSeeder::class);
$this->call(UserSamplesTableSeeder::class);
}
}

цель состоит в том, чтобы создать новую команду, переопределяющую «db: seed», и передать новый параметр, параметр «кроме», DatabaseSeeder учебный класс.

Это последний код, который я создал на своем экземпляре Laravel 5.2 и попробовал:

Команда, поместите в app / Console / Commands, не забудьте обновить ваш Kernel.php:

namespace App\Console\Commands;
use Illuminate\Console\Command;
class SeedExcept extends Command
{
protected $signature = 'db:seed-except {--except=class name to jump}';
protected $description = 'Seed all except one';
public function handle()
{
$except = $this->option('except');
$seeder = new \DatabaseSeeder($except);
$seeder->run();
}
}

DatabaseSeeder

use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
protected $except;

public function __construct($except = null) {
$this->except = $except;
}

public function call($class)
{
if ($class != $this->except)
{
echo "calling $class \n";
//parent::call($class);  // uncomment this to execute after tests
}
}

public function run()
{
$this->call(ExampleTableSeeder::class);
$this->call(UserSamplesTableSeeder::class);
}
}

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

Выполнение этой команды:

php artisan db: семя-исключение

дам тебе:

вызывая ExampleTableSeeder
вызов UserSamplesTableSeeder

Тем не менее, добавив «кроме»:

php artisan db: seed-кроме —except = ExampleTableSeeder

дам тебе

вызов UserSamplesTableSeeder

Это работает с переопределением по умолчанию call метод вашего DatabaseSeeder class и вызов родителя, только если имя класса отсутствует в переменной $ кроме переменной. Переменная заполняется SeedExcept пользовательская команда.

Что касается миграций, то это похоже, но немного сложнее.

Я не могу дать вам проверенный код для этого, но дело в том:

  • Вы создаете migrate-except команда, которая переопределяет MigrateCommand класс (пространство имен Illuminate \ Database \ Console \ Migrations, расположенное в вендоре / laravel / framework / src / Illuminate / Database / Console / Migrations / MigrateCommand.php).
  • MigrateCommand занимает Migrator объект (пространство имен Illuminate \ Database \ Migrations, путь поставщика / laravel / framework / src / Illuminate / Database / Migrations / Migrator.php) в конструкторе (внедренный через IoC). Migrator Класс владеет логикой, которая читает все миграции внутри папки и выполняет ее. Эта логика внутри run() метод
  • создать подкласс Migrator, например MyMigratorи переопределить run() метод пропуска файлов, переданный с помощью специальной опции
  • переопределить __construct() метод вашего MigrateExceptCommand и передать свой MyMigrator: public function __construct(MyMigrator $migrator)

Если у меня будет время, я добавлю код для примера до того, как закончится награда

РЕДАКТИРОВАТЬ
Как и было обещано, вот пример для миграции:

Класс MyMigrator, расширяет Migrator и содержит логику для пропуска файлов:

namespace App\Helpers;
use Illuminate\Database\Migrations\Migrator;
class MyMigrator extends Migrator
{
public $except = null;

// run() method copied from it's superclass adding the skip logic
public function run($path, array $options = [])
{
$this->notes = [];

$files = $this->getMigrationFiles($path);

// skip logic
// remove file from array
if (isset($this->except))
{
$index = array_search($this->except,$files);
if($index !== FALSE){
unset($files[$index]);
}
}
var_dump($files); // debug

$ran = $this->repository->getRan();
$migrations = array_diff($files, $ran);
$this->requireFiles($path, $migrations);

//$this->runMigrationList($migrations, $options);  // commented for debugging purposes
}
}

Пользовательская команда MigrateExcept

namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Database\Console\Migrations\MigrateCommand;
use App\Helpers\MyMigrator;
use Illuminate\Database\Migrations\Migrator;
use Symfony\Component\Console\Input\InputOption;

class MigrateExcept extends MigrateCommand
{
protected $name = 'migrate-except';

public function __construct(MyMigrator $migrator)
{
parent::__construct($migrator);
}

public function fire()
{
// set the "except" param, containing the name of the file to skip, on our custom migrator
$this->migrator->except = $this->option('except');
parent::fire();
}

// add the 'except' option to the command
protected function getOptions()
{
return [
['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use.'],

['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'],

['path', null, InputOption::VALUE_OPTIONAL, 'The path of migrations files to be executed.'],

['pretend', null, InputOption::VALUE_NONE, 'Dump the SQL queries that would be run.'],

['seed', null, InputOption::VALUE_NONE, 'Indicates if the seed task should be re-run.'],

['step', null, InputOption::VALUE_NONE, 'Force the migrations to be run so they can be rolled back individually.'],

['except', null, InputOption::VALUE_OPTIONAL, 'Files to jump'],
];
}
}

Наконец, вам нужно добавить это к поставщику услуг, чтобы разрешить IoC Laravel разрешить зависимости

namespace App\Providers;
use App\Helpers\MyMigrator;
use App\Console\Commands\MigrateExcept;class CustomServiceProvider extends ServiceProvider
{
public function boot()
{
parent::boot($events);

$this->app->bind('Illuminate\Database\Migrations\MigrationRepositoryInterface', 'migration.repository');
$this->app->bind('Illuminate\Database\ConnectionResolverInterface', 'Illuminate\Database\DatabaseManager');

$this->app->singleton('MyMigrator', function ($app) {
$repository = $app['migration.repository'];
return new MyMigrator($repository, $app['db'], $app['files']);
});
}
}

Не забудьте добавить Commands\MigrateExcept::class в Kernel.php

Теперь, если вы выполните

php ремесленник мигрировать-кроме

у тебя есть:

array(70) {
[0] =>
string(43) "2014_04_24_110151_create_oauth_scopes_table"[1] =>
string(43) "2014_04_24_110304_create_oauth_grants_table"[2] =>
string(49) "2014_04_24_110403_create_oauth_grant_scopes_table"...

но добавив параметр кроме:

php artisan migrate — кроме —except = 2014_04_24_110151_create_oauth_scopes_table

array(69) {
[1] =>
string(43) "2014_04_24_110304_create_oauth_grants_table"[2] =>
string(49) "2014_04_24_110403_create_oauth_grant_scopes_table"

Итак, резюмируем:

  • мы создаем пользовательскую команду переноса-кроме, MigrateExcept класс, расширяющий MigrateCommand
  • мы создаем собственный класс переносчика, MyMigrator, расширяя поведение стандарта Migrator
  • когда MigrateExcept — fire (), передайте имя файла, чтобы пропустить его MyMigrator учебный класс
  • MyMigrator переопределяет run() метод Migrator и пропустить пройденную миграцию
  • Более того: поскольку нам нужно проинструктировать Laravel IoC о новых созданных классах, чтобы он мог правильно их внедрить, мы создаем поставщика услуг

Код протестирован, поэтому он должен работать правильно на Laravel 5.2 (надеясь, что&Вставить сработало правильно 🙂 … если у кого-то есть сомнения оставьте комментарий

8

Другие решения

Пропуск семян очень прост, миграций не так много. Чтобы пропустить начальное число, удалите следующее из класса DatabaseSeeder.

$this->call(TableYouDontWantToSeed::class);

Для миграции есть три способа сделать это:

  • Поместите класс, который вы не хотите мигрировать, в другую папку.
  • Вставьте ваши миграции в базу данных вручную (ответ Биндеша Пандьи разработан).
  • Переименуйте файл, который вы не хотите переносить, во что-то вроде UsersTableMigration.dud,

Надеюсь это поможет

3

Я также столкнулся с той же проблемой в моем проекте, но после долгого времени тратить в R & Я обнаружил, что Laravel не предоставляет никакого способа сделать это с миграцией и посевом, но у вас есть 2 способа сделать это.

1) вы сэкономите много времени, просто поместив их в разные папки.
Вы могли бы теоретически создайте свою собственную команду ремесленников что делает что
ты хочешь, или подделывает его путем создания каталогов, перемещения файлов и запуска
php ремесленник мигрировать.

Для сеялок просто сделайте сеялку и вызовите в нее другие сеялки, с которыми вы хотите работать. Тогда просто четко укажите, какую сеялку вы хотите запустить. Попробуй php artisan db:seed --help для более подробной информации там.

2) вы можете создать таблицу вручную (имя которой совпадает с именем, которое таблица миграции создает в вашей базе данных) и вставить значения миграции следующим образом

insert into migrations(migration, batch) values('2015_12_08_134409_create_tables_script',1);

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

2

Если вы хотите просто пропустить (но сохранить) миграцию и сеялку:

  1. Переименуйте вашу миграцию, удалив .php расширение: mv your_migration_file.php your_migration_file
  2. Идти к: DatabaseSeeder.php и закомментируйте строку с вашей нежелательной сеялкой: //$this->call('YourSeeder');,
  3. Бежать: php artisan migrate --seed
  4. Выполните ниже sql-запрос к базе данных (будьте осторожны, там должно быть имя файла миграции БЕЗ расширения) (это предотвратит миграцию ремесленника для выполнения your_migration_file в будущем):

    ВСТАВИТЬ В migrations (migration, batch) ЦЕННОСТИ (your_migration_file1)

  5. Переименуйте ваш файл миграции: mv your_migration_file your_migration_file.php

  6. Раскомментируйте свою сеялку в DatabaseSeeder.php

И вы сделали. Теперь, когда вы бежите php artisan migrate любая миграция должна быть выполнена (кроме новой, если вы добавите несколько новых файлов миграции).

1

просто комментарий идеи сеялка а также схема. я так думаю

//$this->call(HvAccountsSeeder::class);

//Schema::create('users', function (Blueprint $table) {
//  $table->increments('id');
//  $table->string('name');
//  $table->string('email')->unique();
//  $table->string('password');
//  $table->rememberToken();
// $table->timestamps();
// });
// Schema::drop('users');
0

Чтобы прямо ответить на ваш вопрос, у Laravel нет способа сделать это в настоящее время.

Если я вас правильно понимаю, я предполагаю, что вы ищете способ временно отключить / пропустить определенный класс из компонента DatabaseSeeder по умолчанию.

Вы можете легко создать свою собственную команду который примет строку, такую ​​как имя модели / таблицы, и попытается запустить миграцию и заполнение для этой конкретной таблицы. Вам просто нужно что-то вроде следующего:

public function handle(){ //fire for Laravel 4.*

$tables = explode(',', $this->option('tables'));//default []
$skip = explode(',', $this->option('skip'));//default []
$migrations = glob("*table*.php");//get all migrations
foreach($migrations as $migrate){
//if tables argument is set, check to see if part of tables
//if file name not like any in skip.. you get the point
0
По вопросам рекламы [email protected]