yii2 Создание/удаление таблицы с внешним ключом (foreign key, миграция)

  1. Для начала прописываем в консоли команду для создания таблицы в базе данных с помощью миграции:
    ./yii migrate/create create_name_table

    Подробнее о миграциях здесь

  2. Корректируем код в созданном файле /basic/migrations/ваша_миграция.php:
    //Создание таблицы для хранения информации о загруженных картинках
    class m170912_164513_create_images_table extends Migration
    {
        public function up()
        {
    //Добавляем все необходимые поля
            $this->createTable('images', [
                'id' => $this->primaryKey()->notNull(),
                'path' => $this->char(250)->notNull(),
                'description' => $this->char(255)->defaultValue(null),
                'goodId' => $this->bigInteger(20)->notNull(),  //Внимание! Тип поля внешнего ключа должен совпадать с типом связываемого с ним поля
            ]);
            
    // Добавляем foreign key
            $this->addForeignKey(
                'goodId',  // это "условное имя" ключа
                'images', // это название текущей таблицы
                'goodId', // это имя поля в текущей таблице, которое будет ключом
                'goods', // это имя таблицы, с которой хотим связаться
                'id', // это поле таблицы, с которым хотим связаться
                'CASCADE'
            );
        }
      public function down()
          {
              $this->dropTable('images');
            
    //Добавляем удаление внешнего ключа
              $this->dropForeignKey(
                  'goodId',
                  'goods'
              );
          }
    }
  3. Применяем миграцию с помощью команды
    ./yii migrate

Как решить возможные ошибки смотри здесь.

vedro-compota's picture

Что более подробно, чем в примере выше, например:

// Добавляем foreign key
$this->addForeignKey(
	'FK_organization_id',  // это "условное имя" ключа
	'organization_sub', // это название текущей таблицы
	'organization_id', // это имя поля в текущей таблице, которое будет ключом
	'organization', // это имя таблицы, с которой хотим связаться
	'id', // это поле таблицы, с которым хотим связаться
	'CASCADE', // что делать при удалении сущности, на которую ссылаемся
	'CASCADE'  // что делать при обновлении сущности, на которую ссылаемся
);

документация по методу: https://www.yiiframework.com/doc/api/2.0...()-detail

_____________
матфак вгу и остальная классика =)