Допустимые типы столбцов

Типы столбцов указываются в виде строк и могут быть одним из следующих:

  • binary
  • boolean
  • char
  • date
  • datetime
  • decimal
  • float
  • double
  • smallinteger
  • integer
  • biginteger
  • string
  • text
  • time
  • timestamp
  • uuid

Кроме того, адаптер поддерживает MySQL enum, set, blob, tinyblob, mediumblob, longblob, bitи jsonтипы столбцов ( jsonв MySQL 5.7 и выше). При предоставлении предельного значения и использовании binary, varbinaryили blobи его подтипов, тип сохраняемого столбца будет основываться на требуемой длине.

Кроме того, адаптер поддерживает Postgres interval, json, jsonb, uuid, cidr, inetи macaddrтипы столбцов (PostgreSQL 9.3 и выше).

Допустимые параметры столбца

Ниже приведены допустимые параметры столбца:

Для любого типа столбца:

ВариантОписание
limitустановить максимальную длину для строк, также указывает типы столбцов в адаптерах (см. примечание ниже)
lengthпсевдоним для limit
defaultустановить значение по умолчанию или действие
nullразрешить NULLзначения, по умолчанию false (не следует использовать с первичными ключами!) (см. примечание ниже)
afterукажите столбец, после которого следует разместить новый столбец, или используйте \Phinx\Db\Adapter\MysqlAdapter::FIRSTдля размещения столбца в начале таблицы (применимо только к MySQL)
commentустановить текстовый комментарий в столбце

Для decimalстолбцов:

ВариантОписание
precisionв сочетании с scaleнабором для установки десятичной точности
scaleкомбинируйте с, precisionчтобы установить точность до десятичной дроби
signedвключить или отключить unsignedопцию (применимо только к MySQL)

Для enumи setстолбцов:

ВариантОписание
valuesМожет быть списком, разделенным запятыми, или массивом значений

Для integerи bigintegerстолбцов:

ВариантОписание
identityвключить или отключить автоматическое увеличение
signedвключить или отключить unsignedопцию (применимо только к MySQL)

Для timestampстолбцов:

ВариантОписание
defaultустановить значение по умолчанию (использовать с CURRENT_TIMESTAMP)
updateустановить действие, которое будет запускаться при обновлении строки (использовать с CURRENT_TIMESTAMP) (применимо только к MySQL)
timezoneвключить или отключить опцию для и столбцов (применяется только к Postgres)with time zonetimetimestamp

Вы можете добавить created_atи updated_atвременные метки в таблицу , используя addTimestamps()метод. Этот метод принимает три аргумента, где первые два позволяют устанавливать альтернативные имена для столбцов, а третий аргумент позволяет вам включить timezoneпараметр для столбцов. Значения по умолчанию для этих аргументов created_at, updated_atи true соответственно. Для первого и второго аргумента, если вы укажете null, будет использоваться имя по умолчанию, а если вы укажете false, то этот столбец не будет создан. Обратите внимание, что попытка установить оба значения falseвызовет ошибку \RuntimeException. Кроме того, вы можете использовать addTimestampsWithTimezone()метод, который является псевдонимом для addTimestamps()третьего аргумента true(см. Примеры ниже). Вcreated_atстолбец будет иметь значение по умолчанию CURRENT_TIMESTAMP. Только для MySQL update_atстолбец будет иметь значение update CURRENT_TIMESTAMP.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Change.
     */
    public function change()
    {
        // Use defaults (without timezones)
        $table = $this->table('users')->addTimestamps()->create();
        // Use defaults (with timezones)
        $table = $this->table('users')->addTimestampsWithTimezone()->create();

        // Override the 'created_at' column name with 'recorded_at'.
        $table = $this->table('books')->addTimestamps('recorded_at')->create();

        // Override the 'updated_at' column name with 'amended_at', preserving timezones.
        // The two lines below do the same, the second one is simply cleaner.
        $table = $this->table('books')->addTimestamps(null, 'amended_at', true)->create();
        $table = $this->table('users')->addTimestampsWithTimezone(null, 'amended_at')->create();

        // Only add the created_at column to the table
        $table = $this->table('books')->addTimestamps(null, false);
        // Only add the updated_at column to the table
        $table = $this->table('users')->addTimestamps(false);
        // Note, setting both false will throw a \RuntimeError
    }
}

Для booleanстолбцов:

ВариантОписание
signedвключить или отключить unsignedопцию (применимо только к MySQL)

Для stringи textстолбцов:

ВариантОписание
collationустановить сопоставление, которое отличается от значений по умолчанию для таблицы (применимо только к MySQL)
encodingнабор символов, который отличается от значений по умолчанию в таблице (применяется только к MySQL)

Для определений внешнего ключа:

ВариантОписание
update 
deleteустановить действие, которое будет запускаться при удалении строки

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

Вариант ограничения и MySQL

При использовании адаптера MySQL, дополнительные намекая базы данных колонного типа может быть сделано integer, text, blob, tinyblob, mediumblob, longblobколонны. Использование limitс одним из следующих параметров соответственно изменит тип столбца:

ПределТип столбца
BLOB_TINYTINYBLOB
BLOB_REGULARBLOB
BLOB_MEDIUMСРЕДНИЙ БЛОК
BLOB_LONGLONGBLOB
TEXT_TINYTINYTEXT
TEXT_REGULARТЕКСТ
TEXT_MEDIUMСРЕДНИЙ ТЕКСТ
TEXT_LONGLONGTEXT
INT_TINYТИНИИНТ
INT_SMALLМАЛЕНЬКИЙ
INT_MEDIUMСРЕДНИЙ
INT_REGULARINT
INT_BIGBIGINT

Для типов binaryили varbinary, если установлено ограничение, превышающее допустимые 255 байт, тип будет изменен на наиболее подходящий тип большого двоичного объекта с учетом длины.

<?php

use Phinx\Db\Adapter\MysqlAdapter;

//...

$table = $this->table('cart_items');
$table->addColumn('user_id', 'integer')
      ->addColumn('product_id', 'integer', ['limit' => MysqlAdapter::INT_BIG])
      ->addColumn('subtype_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL])
      ->addColumn('quantity', 'integer', ['limit' => MysqlAdapter::INT_TINY])
      ->create();

Типы настраиваемых столбцов и значения по умолчанию

Некоторые системы СУБД предоставляют дополнительные типы столбцов и специфичные для них значения по умолчанию. Если вы не хотите, чтобы ваши миграции не зависели от СУБД, вы можете использовать эти настраиваемые типы в своих миграциях с помощью \Phinx\Util\Literal::fromметода, который принимает строку в качестве единственного аргумента и возвращает экземпляр \Phinx\Util\Literal. Когда Phinx встречает это значение как тип столбца, он знает, что не нужно запускать для него какую-либо проверку и использовать его точно так, как указано, без экранирования. Это также работает для default ценностей.

Вы можете увидеть ниже пример, показывающий, как добавить citextстолбец, а также столбец, значение по умолчанию которого является функцией, в PostgreSQL. Этот метод предотвращения встроенного экранирования поддерживается всеми адаптерами.

<?php

use Phinx\Migration\AbstractMigration;
use Phinx\Util\Literal;

class AddSomeColumns extends AbstractMigration
{
    public function change()
    {
        $this->table('users')
              ->addColumn('username', Literal::from('citext'))
              ->addColumn('uniqid', 'uuid', [
                  'default' => Literal::from('uuid_generate_v4()')
              ])
              ->addColumn('creation', 'timestamp', [
                  'timezone' => true,
                  'default' => Literal::from('now()')
              ])
              ->create();
    }
}

Типы, определяемые пользователем (пользовательский домен данных)

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

data_domain:
    phone_number:
        type: string
        length: 20
    address_line:
        type: string
        length: 150

Каждый определяемый пользователем тип может содержать любой допустимый тип и параметр столбца, они просто используются как «макросы» и заменяются во время миграции.

<?php

//...

$table = $this->table('user_data');
$table->addColumn('user_phone_number', 'phone_number')
      ->addColumn('user_address_line_1', 'address_line')
      ->addColumn('user_address_line_2', 'address_line', ['null' => true])
      ->create();

Определение домена данных в начале вашего проекта имеет решающее значение для получения однородной модели данных. Это позволяет избежать ошибок, таких как наличие множества contact_name столбцов разной длины, несовпадающих целочисленных типов (long vs. bigint и т. Д.).

Для столбцов integer, textи blobможно использовать специальные константы из классов адаптера MySQL и Postgress.

Вы даже можете настроить некоторые внутренние типы, чтобы добавить свои собственные параметры по умолчанию, но некоторые параметры столбцов нельзя переопределить в модели данных (некоторые параметры фиксированы, как и limitдля uuidспециального типа данных).

# Some examples of custom data types
data_domain:
    file:
        type: blob
        limit: BLOB_LONG    # For MySQL DB. Uses MysqlAdapter::BLOB_LONG
    boolean:
        type: boolean       # Customization of the boolean to be unsigned
        signed: false
    image_type:
        type: enum          # Enums can use YAML lists or a comma separated string
        values:
            - gif
            - jpg
            - png

Получить список столбцов

Чтобы получить все столбцы таблицы, просто создайте объект таблицы и вызовите метод getColumns () . Этот метод вернет массив классов столбцов с базовой информацией. Пример ниже:

<?php

use Phinx\Migration\AbstractMigration;

class ColumnListMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $columns = $this->table('users')->getColumns();
        ...
    }

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

Получить столбец по имени

Чтобы получить один столбец таблицы, просто создайте объект таблицы и вызовите метод getColumn () . Этот метод вернет класс Column с базовой информацией или NULL, если столбец не существует. Пример ниже:

<?php

use Phinx\Migration\AbstractMigration;

class ColumnListMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $column = $this->table('users')->getColumn('email');
        ...
    }

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

Проверка наличия столбца

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

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Change Method.
     */
    public function change()
    {
        $table = $this->table('user');
        $column = $table->hasColumn('username');

        if ($column) {
            // do something
        }

    }
}

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

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

<?php

use Phinx\Migration\AbstractMigration;

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

    /**
     * Migrate Down.
     */
    public function down()
    {
        $table = $this->table('users');
        $table->renameColumn('biography', 'bio');
    }
}

Добавление столбца после другого столбца

При добавлении столбца с адаптером MySQL вы можете указать его положение с помощью afterпараметра, где его значение - это имя столбца, после которого он будет размещен.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Change Method.
     */
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('city', 'string', ['after' => 'email'])
              ->update();
    }
}

Это создаст новый столбец cityи разместит его после emailстолбца. Вы можете использовать константу PhinxDbAdapterMysqlAdapterFIRST, чтобы указать, что новый столбец должен быть создан как первый столбец в этой таблице.

Удаление столбца

Чтобы отбросить столбец, используйте removeColumn()метод.

<?php

use Phinx\Migration\AbstractMigration;

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

Указание предела столбца

Вы можете ограничить максимальную длину столбца, используя limitопцию.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Change Method.
     */
    public function change()
    {
        $table = $this->table('tags');
        $table->addColumn('short_name', 'string', ['limit' => 30])
              ->update();
    }
}

Изменение атрибутов столбца

Чтобы изменить тип или параметры столбца в существующем столбце, используйте changeColumn()метод.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $users = $this->table('users');
        $users->changeColumn('email', 'string', ['limit' => 255])
              ->save();
    }

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

    }
}