View file app/Commands/MigrateRollback.php

File size: 1.93Kb
<?php

declare(strict_types=1);

namespace App\Commands;

use App\Models\Migration;
use Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class MigrateRollback extends Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure(): void
    {
        $this->setName('migrate:rollback')
            ->setDescription('Migration rollback');
    }

    /**
     * Run migration
     *
     * @param InputInterface $input
     * @param OutputInterface $output
     *
     * @return int
     */
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $lastMigration = Migration::query()->orderByDesc('batch')->first();
        if (! $lastMigration) {
            $output->writeln('Nothing to rollback');

            return Command::SUCCESS;
        }

        $migrations = Migration::query()
            ->where('batch', $lastMigration->batch)
            ->orderByDesc('id')
            ->get();

        foreach ($migrations as $migration) {
            $migrationPath = __DIR__ . '/../../database/migrations/' . $migration->name . '.php';

            if (! file_exists($migrationPath)) {
                $output->writeln('<error>Migration ' . $migration->name . ' not found</error>');

                return Command::FAILURE;
            }

            try {
                $output->writeln('<comment>Rolling back:</comment> ' . $migration->name);

                $class = require_once $migrationPath;
                $class->down();
            } catch (Exception $e) {
                $output->writeln('<error>' . $e->getMessage() . '</error>');

                return Command::FAILURE;
            }

            usleep(100000);
            $migration->delete();

            $output->writeln('<info>Rolled back:</info> ' . $migration->name);
        }

        return Command::SUCCESS;
    }
}