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