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

<?php

use Phinx\Migration\AbstractMigration;

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

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

    }
}

По умолчанию Phinx указывает адаптеру базы данных создать нормальный индекс. Мы можем передать дополнительный параметр uniqueв addIndex()методе , чтобы указать уникальный индекс. Мы также можем явно указать имя индекса с помощью nameпараметра, порядок сортировки столбцов индекса также можно указать с помощью orderпараметра. Параметр порядка принимает массив имен столбцов и пары ключ / значение порядка сортировки.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $table = $this->table('users');
        $table->addColumn('email', 'string')
              ->addColumn('username','string')
              ->addIndex(['email', 'username'], [
                    'unique' => true,
                    'name' => 'idx_users_email',
                    'order' => ['email' => 'DESC', 'username' => 'ASC']]
                    )
              ->save();
    }

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

    }
}

Адаптер MySQL также поддерживает fulltextиндексы. Если вы используете версию до 5.6, вы должны убедиться, что таблица использует MyISAMдвижок.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users', ['engine' => 'MyISAM']);
        $table->addColumn('email', 'string')
              ->addIndex('email', ['type' => 'fulltext'])
              ->create();
    }
}

Кроме того, адаптер MySQL также поддерживает установку длины индекса, определяемой параметром limit. При использовании индекса с несколькими столбцами вы можете определить длину индекса каждого столбца. Индекс одного столбца может определять длину своего индекса с указанием имени столбца или без него в параметре ограничения.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('email', 'string')
              ->addColumn('username','string')
              ->addColumn('user_guid', 'string', ['limit' => 36])
              ->addIndex(['email','username'], ['limit' => ['email' => 5, 'username' => 2]])
              ->addIndex('user_guid', ['limit' => 6])
              ->create();
    }
}

Адаптеры SQL Server и PostgreSQL также поддерживают include(неключевые) столбцы в индексах.

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('email', 'string')
              ->addColumn('firstname','string')
              ->addColumn('lastname','string')
              ->addIndex(['email'], ['include' => ['firstname', 'lastname']])
              ->create();
    }
}

Удалить индексы так же просто, как вызвать removeIndex()метод. Вы должны вызвать этот метод для каждого индекса.

<?php

use Phinx\Migration\AbstractMigration;

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

        // alternatively, you can delete an index by its name, ie:
        $table->removeIndexByName('idx_users_email')
            ->save();
    }

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

    }
}