У меня есть пара миграций в новом проекте Laravel 4. Один для регионов, а другой для областей. В каждом регионе есть несколько областей, и области относятся к регионам.
Я использовал Laravel 4 и функции миграции в ряде случаев, но никогда раньше не сталкивался с этой проблемой. Когда я запускаю php artisan migrate:install
за которым следует php artisan migrate
я получаю следующую ошибку:
$ php artisan migrate [Exception] SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'region_ id' doesn't exist in table (SQL: alter table `areas` add constraint areas_r egion_id_foreign foreign key (`region_id`) references `regions` (`id`)) (Bi ndings: array ( )) migrate [--bench[="..."]] [--database[="..."]] [--path[="..."]] [--package[="... "]] [--pretend] [--seed]
// Миграция регионов
class CreateRegionsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // Creates the regions table Schema::create('regions', function($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('name', 160)->unique(); $table->timestamps(); }); } }
// Перемещение областей
class CreateAreasTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // Creates the cemeteries table Schema::create('areas', function($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->foreign('region_id')->references('id')->on('regions'); $table->string('name', 160)->unique(); $table->timestamps(); }); } }
Вы должны создать столбец, связанный с внешним ключом:
class CreateAreasTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // Creates the cemeteries table Schema::create('areas', function($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->integer('region_id')->unsigned(); $table->foreign('region_id')->references('id')->on('regions'); $table->string('name', 160)->unique(); $table->timestamps(); }); } }
Иногда (в зависимости от сервера базы данных) вам придется создавать внешние ключи в два этапа:
class CreateAreasTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // Create the table and the foreign key column Schema::create('areas', function($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->integer('region_id')->unsigned(); $table->string('name', 160)->unique(); $table->timestamps(); }); // Create the relation Schema::tabe('areas', function($table) { $table->foreign('region_id')->references('id')->on('regions'); }); } }
и не забудьте сделать внешние ключи неподписанными.
$table->integer('region_id')->unsigned();