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: