Объект таблицы

Объект Table - один из самых полезных API, предоставляемых Phinx. Он позволяет легко манипулировать таблицами базы данных с помощью кода PHP. Вы можете получить экземпляр объекта Table, вызвав table()метод из миграции вашей базы данных.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $table = $this->table('tableName');
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}

Затем вы можете управлять этой таблицей, используя методы, предоставляемые объектом Table.

Сохранение изменений

При работе с объектом Table Phinx сохраняет определенные операции в кеше отложенных изменений. После того, как вы внесли в таблицу нужные изменения, вы должны их сохранить. Чтобы выполнить эту операцию, Phinx предоставляет три метода, create(), update(), и save(). create()сначала создаст таблицу, а затем выполнит отложенные изменения. update()просто запустит ожидающие изменения и должен использоваться, когда таблица уже существует. save() - это вспомогательная функция, которая сначала проверяет, существует ли таблица, и если она не будет запущена create(), иначе она будет запущена update().

Как указано выше, при использовании change()метода миграции вы всегда должны использовать create()или update(), и никогда, save()поскольку в противном случае миграция и откат могут привести к различным состояниям из-за save()вызова create()при запуске migrate, а затем update()при откате. При использовании up()/ down()методов безопасно использовать любой save()или более явные методы.

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

Создание таблицы

Создать таблицу с помощью объекта Table действительно просто. Создадим таблицу для хранения коллекции пользователей.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $users = $this->table('users');
        $users->addColumn('username', 'string', ['limit' => 20])
              ->addColumn('password', 'string', ['limit' => 40])
              ->addColumn('password_salt', 'string', ['limit' => 40])
              ->addColumn('email', 'string', ['limit' => 100])
              ->addColumn('first_name', 'string', ['limit' => 30])
              ->addColumn('last_name', 'string', ['limit' => 30])
              ->addColumn('created', 'datetime')
              ->addColumn('updated', 'datetime', ['null' => true])
              ->addIndex(['username', 'email'], ['unique' => true])
              ->create();
    }
}

Столбцы добавляются с помощью addColumn()метода. Мы создаем уникальный индекс для столбцов имени пользователя и электронной почты, используя этот addIndex()метод. Наконец, вызов create()фиксирует изменения в базе данных.

Phinx автоматически создает автоматически увеличивающийся столбец первичного ключа, вызываемый idдля каждой таблицы.

idОпция задает имя автоматически созданное поле идентификатора, в то время как primary_key опция выбирает поле или поля , используемые для первичного ключа. idвсегда будет переопределять primary_key параметр, если он не установлен в значение false. Если вам не нужно, чтобы для первичного ключа было установлено idзначение false без указания a primary_key, и первичный ключ не будет создан.

Чтобы указать альтернативный первичный ключ, вы можете указать primary_keyпараметр при доступе к объекту Table. Давайте отключим автоматический idстолбец и вместо этого создадим первичный ключ, используя два столбца:

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('followers', ['id' => false, 'primary_key' => ['user_id', 'follower_id']]);
        $table->addColumn('user_id', 'integer')
              ->addColumn('follower_id', 'integer')
              ->addColumn('created', 'datetime')
              ->create();
    }
}

Установка сингла primary_keyне включает эту AUTO_INCREMENTопцию. Чтобы просто изменить имя первичного ключа, нам нужно переопределить idимя поля по умолчанию :

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function up()
    {
        $table = $this->table('followers', ['id' => 'user_id']);
        $table->addColumn('follower_id', 'integer')
              ->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])
              ->create();
    }
}

Кроме того, адаптер MySQL поддерживает следующие параметры:

ВариантОписание
комментарийустановить текстовый комментарий к таблице
row_formatустановить формат строки таблицы
двигательопределить движок таблицы (по умолчанию InnoDB)
сопоставлениеопределить сопоставление таблиц (по умолчанию utf8_general_ci)
подписанныйявляется ли первичный ключ signed (по умолчанию true)
пределустановить максимальную длину первичного ключа

По умолчанию первичный ключ signed. Чтобы просто установить для него значение без знака, просто передайте signedпараметр со falseзначением:

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('followers', ['signed' => false]);
        $table->addColumn('follower_id', 'integer')
              ->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])
              ->create();
    }
}

Адаптер PostgreSQL поддерживает следующие параметры:

ВариантОписание
комментарийустановить текстовый комментарий к таблице


Определение существования таблицы

Вы можете определить, существует ли таблица, используя этот hasTable() метод.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $exists = $this->hasTable('users');
        if ($exists) {
            // do something
        }
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}

 

Удаление таблицы

Таблицы можно довольно легко отбросить с помощью этого drop()метода. Рекомендуется снова воссоздать таблицу в down()методе.

Обратите внимание, что, как и другие методы в Tableклассе, dropтакже необходимо save() вызывать в конце для выполнения. Это позволяет phinx грамотно планировать миграции, когда задействовано более одной таблицы.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $this->table('users')->drop()->save();
    }

    /**
     * Migrate Down.
     */
    public function down()
    {
        $users = $this->table('users');
        $users->addColumn('username', 'string', ['limit' => 20])
              ->addColumn('password', 'string', ['limit' => 40])
              ->addColumn('password_salt', 'string', ['limit' => 40])
              ->addColumn('email', 'string', ['limit' => 100])
              ->addColumn('first_name', 'string', ['limit' => 30])
              ->addColumn('last_name', 'string', ['limit' => 30])
              ->addColumn('created', 'datetime')
              ->addColumn('updated', 'datetime', ['null' => true])
              ->addIndex(['username', 'email'], ['unique' => true])
              ->save();
    }
}

Переименование таблицы

Чтобы переименовать таблицу, обратитесь к экземпляру объекта Table, затем вызовите rename()метод.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $table = $this->table('users');
        $table
            ->rename('legacy_users')
            ->update();
    }

    /**
     * Migrate Down.
     */
    public function down()
    {
        $table = $this->table('legacy_users');
        $table
            ->rename('users')
            ->update();
    }
}

Изменение первичного ключа

Чтобы изменить первичный ключ в существующей таблице, используйте changePrimaryKey()метод. Передайте имя столбца или массив имен столбцов для включения в первичный ключ или nullдля удаления первичного ключа. Обратите внимание, что указанные столбцы необходимо добавить в таблицу, они не будут добавляться неявно.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $users = $this->table('users');
        $users
            ->addColumn('username', 'string', ['limit' => 20, 'null' => false])
            ->addColumn('password', 'string', ['limit' => 40])
            ->save();

        $users
            ->addColumn('new_id', 'integer', ['null' => false])
            ->changePrimaryKey(['new_id', 'username'])
            ->save();
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}

Изменение комментария к таблице

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

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $users = $this->table('users');
        $users
            ->addColumn('username', 'string', ['limit' => 20])
            ->addColumn('password', 'string', ['limit' => 40])
            ->save();

        $users
            ->changeComment('This is the table with users auth information, password should be encrypted')
            ->save();
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}