Допустимые типы столбцов
Типы столбцов указываются в виде строк и могут быть одним из следующих:
- 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_TINY | TINYBLOB |
BLOB_REGULAR | BLOB |
BLOB_MEDIUM | СРЕДНИЙ БЛОК |
BLOB_LONG | LONGBLOB |
TEXT_TINY | TINYTEXT |
TEXT_REGULAR | ТЕКСТ |
TEXT_MEDIUM | СРЕДНИЙ ТЕКСТ |
TEXT_LONG | LONGTEXT |
INT_TINY | ТИНИИНТ |
INT_SMALL | МАЛЕНЬКИЙ |
INT_MEDIUM | СРЕДНИЙ |
INT_REGULAR | INT |
INT_BIG | BIGINT |
Для типов 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()
{
}
}
0 комментариев