`Ограничение внешнего ключа неправильно сформировано` в Phinx Migrations (CakePhp3)

У меня есть эти два файла миграции, и я хочу добавить первичный ключ «клиенты» в качестве внешнего ключа в «образцы» но при переносе выдает ошибку «Неверно сформировано ограничение внешнего ключа».

Вот скриншот командной строки:

Скриншот ошибки

Вот мой код:

CreateClients

<?php
use Migrations\AbstractMigration;

class CreateClients extends AbstractMigration
{
public function change()
{
$table = $this->table('clients');

$table->addColumn('name', 'string', [
'limit' => 100,
'null' => false,
]);
$table->addColumn('title', 'string', [
'default' => null,
'limit' => 100,
'null' => true,
]);
$table->addColumn('street', 'string', [
'limit' => 255,
'null' => false,
]);
$table->addColumn('city', 'string', [
'limit' => 255,
'null' => false,
]);
$table->addColumn('state', 'string', [
'default' => null,
'limit' => 255,
'null' => false,
]);
$table->addColumn('zipcode', 'biginteger', [
'limit' => 10,
'null' => false,
]);
$table->addColumn('country', 'string', [
'limit' => 255,
'null' => false,
]);
$table->addColumn('phone', 'biginteger', [
'limit' => 10,
'null' => false,
]);
$table->addColumn('emailprimary', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('emailsecondary', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('username', 'string', [
'limit' => 255,
'null' => false,

])->addIndex(array('username'), array('unique' => true));
$table->addColumn('password', 'string', [
'default' => null,
'limit' => 255,
'null' => false,
]);
$table->addColumn('billing_title', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('billing_street', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('billing_city', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('billing_state', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('billing_zipcode', 'biginteger', [
'default' => null,
'limit' => 20,
'null' => true,
]);
$table->addColumn('billing_country', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->addColumn('billing_phone', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->create();
}
}

CreateSamples

<?php
use Migrations\AbstractMigration;

class CreateSamples extends AbstractMigration
{
/**
* Change Method.
*
* More information on this method is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-change-method
* @return void
*/
public function change()
{
$table = $this->table('samples');

$table->addColumn('name', 'string', [
'limit' => '100',
'null' => false,
]);
$table->addColumn('client_id', 'integer', [
'null' => false,
]);
$table->addForeignKey('client_id', 'clients', 'id', array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION'));
$table->save();

$table->create();
}
}

0

Решение

В вашей миграции CreateSamples вы определяете client_id столбец как не нуль. Однако, когда вы определяете внешний ключ, вы делаете это как on delete, set null, Это не может идти вместе. Вместо SET_NULL, CASCADE или же RESTRICT будет лучшим выбором, в зависимости от логики вашего приложения. (Ограничение будет препятствовать удалению клиентов с образцами.) Вы также можете определить client_id столбец как 'null' => 'true',
Так, например, попробуйте это:

$table->addForeignKey('client_id', 'clients', 'id', array('delete'=> 'CASCADE', 'update'=> 'NO_ACTION'));

Это удалит образцы при удалении клиента.

Больше объяснений о поведении MySQL Вот.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]