Задать вопрос
@Airslip

Как привязать поля таблиц в миграциях?

Приветствую, прошу помощи, не один день пытаюсь решить проблему.
Использую файл-миграции в Yii2 для создания базы данных, все таблицы и элементы создаются нормально, но когда я пытаюсь сделать привязку одного поля к другому, то консоль пишет ошибку: "errno 150 foreign key constraint is incorrectly formed". Что я делаю не так, подскажите пожалуйста?
public function up()
{
	$tableOptions = null;
	if ($this->db->driverName === 'mysql') {
		$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
	}
	// Организации
	$this->createTable('{{%company}}', [
		'id' => $this->primaryKey(),
		'name' => $this->string(),
		'code' => $this->string(),
		'city' => $this->string(),
		'address' => $this->string(),
		'schedule' => $this->string(),
		'link' => $this->string(),
	], $tableOptions);

	// Телефоны
	$this->createTable('{{%phone}}', [
		'id' => $this->primaryKey(),
		'company' => $this->string(),
		'number' => $this->string(),
	], $tableOptions);

	$this->addForeignKey("fk-phone-company", "{{%phone}}", "company", "{{%company}}", "name", 'SET NULL', 'RESTRICT');
}
  • Вопрос задан
  • 341 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@masterfreelance
программист со стажем
У вас поля "{{%phone}}.company" и "{{%company}}.name" не индексные, поэтому внешняя связь и не создается.
И зачем вы делаете связь по полям "{{%phone}}.company" и "{{%company}}.name"? У вас же есть primaryKey в каждой таблице.
Я бы сделал так:
public function up()
{
  $tableOptions = null;
  if ($this->db->driverName === 'mysql') {
    $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
  }
  // Организации
  $this->createTable('{{%company}}', [
    'id' => $this->primaryKey(),
    'name' => $this->string(),
    'code' => $this->string(),
    'city' => $this->string(),
    'address' => $this->string(),
    'schedule' => $this->string(),
    'link' => $this->string(),
  ], $tableOptions);

  // Телефоны
  $this->createTable('{{%phone}}', [
    'id' => $this->primaryKey(),
    'company_id' => $this->integer(),
    'number' => $this->string(),
  ], $tableOptions);
  $this->createIndex('idx-phone-company_id', '{{%phone}}', 'company_id');
  $this->addForeignKey("fk-phone-company", "{{%phone}}", "company_id", "{{%company}}", "id", 'SET NULL', 'RESTRICT');
}
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Делайте привязку по id, а не по названию компании.
В таблице phone создайте поле company_id, тип поля $this->integer().
Установите индексы на id компании и company_id в таблице phone.
После этого устанавливайте ключ.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы