Как сбросить базу данных в Laravel 6? - PullRequest
1 голос
/ 09 января 2020

Итак, у меня проблема с мультитенантным приложением, и у меня есть система, где я могу управлять всеми этими арендаторами с помощью стандартных операций CRUD. Я хочу иметь возможность отбрасывать базы данных арендаторов при удалении арендатора, но я не могу найти в документации ничего о том, как это сделать, и не могу найти ряд методов в документации API, которые можно использовать.

Я видел приведенный ниже онлайн (единственная информация, которую я могу найти), но ему уже 2 года, но все эти методы устарели или были перенесены в Laravel 6.

Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");

С помощью моих собственных тестов работает следующая команда.

DB::statement('DROP DATABASE `foo`');

Чего я не могу сделать, так это связать переменную с этим оператором:

DB::statement(DB::raw('DROP DATABASE ?', $database_name));

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

DatabaseManager::dropDatabase($database_name);

или это:

$database = DatabaseManager::connect($database_name);
$database->dropDatabase();

Я думаю, мне нужно создать новое соединение с MySQL, где я не подключаюсь напрямую к отдельной базе данных. Затем выполните команду, чтобы удалить базу данных, а затем закрыть соединение.

Я буду искать, чтобы построить это сам, но просто интересно, есть ли у кого-нибудь какие-либо мысли по этому поводу, или если в любом случае делал это раньше? Вся помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 09 января 2020

Чтобы удалить записи из таблицы:

DB::table('table_name')->delete();

Если вы хотите sh обрезать всю таблицу, что приведет к удалению всех строк и сбросу идентификатора автоинкремента к нулю, вы можете использовать метод усечения:

DB::table('table_name')->truncate();

или удаление таблицы с использованием Schema::dropIfExists('table_name');

для удаления базы данных Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("database");

0 голосов
/ 09 января 2020

Выводы

После некоторых исследований и мастеринга у меня есть два варианта.

1. Doctrine DBAL

Я заглянул в библиотеку Doctrine DBAL и нашел именно то, что искал. Библиотека для управления выполнением команды.

Это просто в использовании, как уже упоминалось в вопросе выше, вам нужно выполнить этот фрагмент кода:

Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");

ПРИМЕЧАНИЕ : для того, чтобы сделать это, сначала нужно запросить библиотеку через composer:

composer require doctrine/dbal

Если углубиться в этот метод, он действительно не стоит лишнего кода, не говоря уже о включение библиотеки в качестве кода, который она выполняет, выглядит следующим образом: [github] :

/**
 * Returns the SQL snippet to drop an existing database.
 *
 * @param string $database The name of the database that should be dropped.
 */
public function getDropDatabaseSQL(string $database) : string
{
    return 'DROP DATABASE ' . $database;
}

, что в точности совпадает с тем, что вы делаете в варианте 2.

2. Laravel DB :: Statement ()

Этот метод делает то же самое и намного проще. Все, что нужно, это следующий фрагмент кода:

DB::statement("DROP DATABASE `{$database_name}`");

Заключение

TLDR; Для этого используйте DB Facade Laravel вместо решения стороннего производителя. Это понятнее, проще и использует меньше кода.

Теперь я знаю, что для этого может быть не так много причин, как указал @Rwd, но я постараюсь использовать его каким-то образом для автоматизировать процесс очистки избыточных баз данных. Я, вероятно, создам некоторую форму контейнера DatabaseManager, где каждый менеджер будет содержать версию информации базы данных на основе экземпляра, и включит метод для обработки сброса базы данных.

Благодаря @Rwd и @apokryfos для обсуждение.

0 голосов
/ 09 января 2020

Вы можете создать команду laravel для удаления базы данных. Например:

php дБ ремесленника: отбрасывание $ database_name

  1. php ремесленник make: команда dbDrop
  2. внутри команд / dbDrop. php:

    protected $signature = 'db:drop {database_name}';
    
    protected $description = 'Drop a database.';
    
    public function __construct()
    {
        parent::__construct();
    }
    
    public function handle()
    {
        // Fetch the defined database name
        $db_type = \Config::get('database.default');
        $connection = \Config::get('database.connections.'.$db_type);
        $host = $connection['host'];
        $username = $connection['username'];
        $password = $connection['password'];
        $database = $connection['database'];
        $this->dropDB($host, $username, $password, $database);
    }
      protected function dropDB($host, $username, $password, $database)
     {
    
    
    
            try
            {
                $db = $this->argument('database_name');
                // Create connection
                $conn = new \mysqli($host, $username, $password);
                $this->info(json_encode($conn));
                // return $conn;
                // Check connection
                if ($conn->connect_error) {
                    die("Connection failed: " . $conn->connect_error);
                } 
                // Drop database
                $sql = "DROP DATABASE `$db`";
                if ($conn->query($sql) === TRUE) {
                    echo "Sucessfully dropped database $db!";
                } else {
                    echo "Error dropping database: " . $conn->error;
                }
                $conn->close();
            }
            catch(Exception $e){
                $this->info('');
                echo "Error dropping database: $db";
                $this->info('');
                echo json_encode($e->getMessage());
                $this->info('');
                $this->info('You can try the mysql shell.');
            }
    
        }
    } 
    
...