Criando Chave Estrangeira em Migrações Laravel

Hoje eu estava testando o Laravel’s Migration.

Tentei criar duas tabelas com a segunda tabela tendo uma chave estrangeira que referencia a primeira tabela.

A primeira mesa

<?php 
// products table
public function up()
{
Schema::create('products', function($table){
$table
->increments('id');
$table
->string('name');
$table
->timestamps();
});
}

A segunda mesa

<?php
// products pricing table
public function up()
{
Schema::create('product_prices', function($table){

$table
->increments('id');
$table
->foreign('product_id')->references('id')->on('products');
$table
->string('price');
$table
->timestamps();
});
}

Tive este erro olhando nos meus olhos:
[IlluminateDatabaseQueryException] SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'product_id' doesn't exist in table (SQL: alter table `cs_product_prices` add constraint product_prices_product_id_foreign foreign key (`product_id`) references `cs_products` (`id`))

Depois de grocar aqui e ali pela internet. Parece que chamar diretamente o método estrangeiro não cria a coluna com a referência, o que meu cérebro idiota pensou. Então eu reescrevi a tabela assim.


public function up()
{
Schema::create('product_prices', function($table){

$table
->increments('id');
$table
->integer('product_id');
$table
->foreign('product_id')->references('id')->on('products');
$table
->string('price');
$table
->timestamps();
});
}

Agora, outro erro olhou nos meus olhos:
[IlluminateDatabaseQueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `cs_product_prices` add constraint product_prices_product_id_foreign foreign key (`product_id`) references `cs_products` (`id`))

Depois de alguns minutos grocando, percebo que as colunas correspondentes na chave estrangeira e a chave referenciada devem ter tipos de dados semelhantes. O tamanho e o sinal dos tipos inteiros devem ser os mesmos. O método increments () define um inteiro sem sinal com incremento automático por padrão no banco de dados mysql.

Alterando a segunda tabela novamente:

public function up()
{
Schema::create('product_prices', function($table){

$table
->increments('id');
$table
->integer('product_id')->unsigned();
$table
->foreign('product_id')->references('id')->on('products');
$table
->string('price');
$table
->timestamps();
});
}

Agora a migração funciona.
Mais informações referem-se à seguinte fonte:

  1. Chave estrangeira MySQL
  2. Método estrangeiro () do Laravel