Объект таблицы
Объект 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()
{
}
}
0 комментариев