2015-11-10 3 views
8

Я пытаюсь написать миграции базы данных Laravel, но я получаю следующее сообщение об ошибке о внешнем ключе:Laravel миграция не может добавить внешний ключ

[Illuminate\Database\QueryException]                                                      
    SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'category_id' doesn't exist in table (SQL: alter table `subcategories` add constraint subcategories_category_id_foreign foreign key (`category_id`) references `categories` (`id`)) 



    [PDOException]                       
    SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'category_id' doesn't exist in table 

В categories и subcategories таблицы действительно получить создана, но внешнего ключа нет. Вот моя миграция:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateCategoryTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('categories', function ($table) { 
      $table->increments('id')->unsigned(); 
      $table->string('name')->unique(); 
     }); 

     Schema::create('subcategories', function ($table) { 
      $table->increments('id')->unsigned(); 
      $table->foreign('category_id')->references('id')->on('categories'); 
      $table->string('name')->unique(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('categories'); 
     Schema::drop('subcategories'); 
    } 
} 

Любые идеи? Благодаря!

+0

Вам не нужно поле автоматического приращения как неподписанное только ссылку на внешний ключ. –

ответ

18

Вы должны создать столбец перед созданием внешнего ключа:

$table->integer('category_id')->unsigned(); 
$table->foreign('category_id')->references('id')->on('categories'); 

Документация: http://laravel.com/docs/5.1/migrations#foreign-key-constraints

+0

О! Глупая ошибка. Спасибо! –

+0

@RoemerBakker, если вы довольны моим ответом, вы можете принять его :) –

+0

С этим похвастаться! Пришлось ждать еще 5 минут вчера, когда вы ответили и забыли принять его после. Хорошего дня! ;) –

0

Я забыл добавить ->get() к методам я назвал.

Смежные вопросы