@Laravel Migration: Невозможно добавить ограничение внешнего ключа в laravel - PullRequest
0 голосов
/ 19 октября 2018

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

λ php artisan migrate
Migration table created successfully.


[Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `fees` add constraint `fee
  s_fee_type_id_foreign` foreign key (`fee_type_id`) references `feetypes` (`fee_type_id`))


  [PDOException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

Мой код миграции выглядит так:

сборы

<?php

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

class CreateFeesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('fees', function (Blueprint $table) {
            $table->increments('fee_id');
            $table->integer('academic_id')->unsigned();
            $table->integer('level_id')->unsigned();
            $table->integer('fee_type_id');
            $table->string('fee_heading', 100)->nullable();
            $table->float('amount', 8, 2);
            $table->foreign('academic_id')->references('academic_id')->on('academics');
            $table->foreign('level_id')->references('level_id')->on('levels');
            $table->foreign('fee_type_id')->references('fee_type_id')->on('feetypes');
        });
    }

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

fesstypes

<?php

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

class CreateFeetypesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('feetypes', function (Blueprint $table) {
            $table->unsignedinteger('fee_type_id');
            $table->string('fee_type', 100);
        });
    }

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

Любые идеи относительно того, что я сделал неправильно, я хочу получить это прямо сейчас, так как у меня есть много таблиц, которые мне нужнынапример, «Пользователи», «Студенты», «Левес» и т. д. В идеале я хочу создать таблицы, в которых эти данные хранятся с внешними ключами, то есть с тарифами и типами.

Надеюсь, что кто-то может помочь мне начать работу.

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Сначала необходимо создать индекс для ссылочного столбца, например, fee_type_id в таблице feetypes.

MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстройи не требует сканирования таблицы.В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке.Такой индекс создается в ссылочной таблице автоматически, если он не существует.Этот индекс может быть автоматически удален позже, если вы создадите другой индекс, который можно будет использовать для применения ограничения внешнего ключа.index_name, если дано, используется, как описано ранее.

С Справочное руководство по MySQL

0 голосов
/ 19 октября 2018

Проверьте все совпадения типов данных для указанных типов данных.

public function up()
{
    Schema::create('fees', function (Blueprint $table) {
        $table->increments('fee_id');
        $table->unsignedInteger('academic_id');
        $table->unsignedInteger('level_id');
        $table->unsignedInteger('fee_type_id');
        $table->string('fee_heading', 100)->nullable();
        $table->float('amount', 8, 2);
        $table->foreign('academic_id')->references('academic_id')->on('academics');
        $table->foreign('level_id')->references('level_id')->on('levels');
        $table->foreign('fee_type_id')->references('fee_type_id')->on('feetypes');
    });
}

проверьте level_id в уровнях, acade_id в академических кругах, fee_type_id в feetypes также unsignedInteger или автоинкремент и измените сценарий создания таблицы на один выше.

0 голосов
/ 19 октября 2018

CreateFeesTable.php

изменить

$table->integer('fee_type_id');

на

$table->unsignedInteger('fee_type_id');

CreateFeetypesTable

изменить

$table->unsignedinteger('fee_type_id');

на

$table->increments('fee_type_id'); или $table->integer('fee_type_id');

0 голосов
/ 19 октября 2018

Заменить эту строку:

$table->integer('fee_type_id');

На это:

$table->unsignedInteger('fee_type_id');

В CreateFeesTable Миграция.

...