2017-02-11 2 views
-1

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

<?php 

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

class CreateAdminTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() { 
     Schema::create('Admin' , function($table){ 
      $table->increments('id'); 
      $table->mediumText('title'); 
      $table->text('blog_content'); 
      $table->char('tag' , 15); 
     }); 
    } 
    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() { 
     Schema::drop('Admin'); 
    } 
} 

выше миграция моей admin таблицы, то, что я бы Очень нравится делать, это добавить внешний ключ в мою таблицу admin, связанную с моей таблицей tags. что-то вроде:

$table->foreign('tag')->references('tag')->on('tags'); 

Как это сделать сейчас, когда я уже выполнил миграцию?

EDIT :: Я попытался следовать:

ШАГ 1: удалил tag столбец из таблицы admin из PhpMyAdmin.

ШАГ 2: Пытался выполнить следующую миграцию:

<?php 

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

class AddForeignKeyTagsColumn extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('Admin', function (Blueprint $table) { 
      $table->char('tag' , 15)->after('slug'); 
      $table->foreign('tag')->references('tag')->on('tags'); 
     }); 
    } 

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

Но я получаю следующее сообщение об ошибке:

enter image description here

Почему внешний ключ не может быть создан ??

спасибо.

+0

Что касается вашего редактирования. Является ли ваша таблица кодировкой myisam/innodb?попробуйте изменить его на innodb, поскольку myisam не поддерживает внешние ключи. – Gravy

+0

@Gravy изменил следующее в config/database.php ''engine' =>« InnoDB »,' .. удалил и воссоздал все таблицы, но я все еще получаю ошибку, что ' SQLSTATE [HY000]: Общая ошибка: 1215 Can not добавить внешний ключ Заключительный ключ tag_foreign' ('tag') указывает' tags' ('tag'))'. –

ответ

1

Миграции - это контроль версий для вашего дБ. Нет смысла писать миграции, если вы не собираетесь использовать функциональность управления версиями.

Так просто, вы можете изменить таблицу, создав новую миграцию ... из командной строки:

php artisan make:migration alter_table_admin_add_foreign_tag

Затем в новой миграции, сделать ваш вверх и вниз методов.

Как только ваша миграция будет готова, php artisan migrate.

ОТНОСИТЕЛЬНО EDITED ВОПРОС:

Обе таблицы должны быть innodb и не myisam. Кроме того, оба родительских ключа столбца и ключ отношения должны быть одного и того же типа данных. Таким образом, в вашем tags таблице также выполнен с $table->char('tag' , 15);

SIDE NOTE/предложение:

Почему у вас есть некоторые таблицы единственного и множественного числа некоторых. и почему у вас есть несколько таблиц, начинающихся с прописной буквы, и других таблиц в нижнем регистре? Admin может быть admins и tags может оставаться tags для согласованности.

+0

Я изменил таблицы, чтобы быть innodb, также я добавил те же типы данных для 'tag' feild, все еще не могу создать внешний ключ, я все равно получаю сообщение об ошибке http://imgur.com/a/AWunG –

+0

- это имя вашей таблицы' admin' или 'Admin'? – Gravy

-1

Создать новую миграцию с помощью следующего кода:

public function up() { 
    Schema::table('Admin' , function($table){ 
     $table->foreign('tag')->references('tag')->on('tags'); 
    }); 
} 

public function down() { 
    Schema::table('Admin' , function($table){ 
     $table->dropForeign('Admin_tag_foreign'); 
    }); 
} 

Затем запустите php artisan migrate

+0

Почему downvote? – Paras