Phinx поддерживает создание ограничений внешнего ключа для таблиц базы данных. Добавим внешний ключ в примерную таблицу:
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$table = $this->table('tags');
$table->addColumn('tag_name', 'string')
->save();
$refTable = $this->table('tag_relationships');
$refTable->addColumn('tag_id', 'integer', ['null' => true])
->addForeignKey('tag_id', 'tags', 'id', ['delete'=> 'SET_NULL', 'update'=> 'NO_ACTION'])
->save();
}
/**
* Migrate Down.
*/
public function down()
{
}
}
Действия «При удалении» и «При обновлении» определяются с помощью массива опций «удалить» и «обновить». Возможные значения: SET_NULL, NO_ACTION, CASCADE и RESTRICT. Если используется «SET_NULL», то столбец должен быть создан как допускающий значение NULL с помощью этой опции . Имя ограничения можно изменить с помощью опции 'constraint'.['null' => true]
Также можно передать addForeignKey()
массив столбцов. Это позволяет нам установить связь внешнего ключа с таблицей, в которой используется комбинированный ключ.
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$table = $this->table('follower_events');
$table->addColumn('user_id', 'integer')
->addColumn('follower_id', 'integer')
->addColumn('event_id', 'integer')
->addForeignKey(['user_id', 'follower_id'],
'followers',
['user_id', 'follower_id'],
['delete'=> 'NO_ACTION', 'update'=> 'NO_ACTION', 'constraint' => 'user_follower_id'])
->save();
}
/**
* Migrate Down.
*/
public function down()
{
}
}
Мы можем добавить именованные внешние ключи с помощью constraint
параметра. Эта функция поддерживается начиная с версии Phinx 0.6.5.
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$table = $this->table('your_table');
$table->addForeignKey('foreign_id', 'reference_table', ['id'],
['constraint' => 'your_foreign_key_name']);
->save();
}
/**
* Migrate Down.
*/
public function down()
{
}
}
Мы также можем легко проверить, существует ли внешний ключ:
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$table = $this->table('tag_relationships');
$exists = $table->hasForeignKey('tag_id');
if ($exists) {
// do something
}
}
/**
* Migrate Down.
*/
public function down()
{
}
}
Наконец, чтобы удалить внешний ключ, используйте dropForeignKey
метод.
Обратите внимание, что, как и другие методы в Table
классе, dropForeignKey
также необходимо save()
вызывать в конце для выполнения. Это позволяет phinx грамотно планировать миграции, когда задействовано более одной таблицы.
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$table = $this->table('tag_relationships');
$table->dropForeignKey('tag_id')->save();
}
/**
* Migrate Down.
*/
public function down()
{
}
}
0 комментариев