Laravel не может добавить ограничение внешнего ключа - миграция

У меня проблема с внешним ключом. У меня есть пользователь, имеющий пол:

Мои пользователи миграции:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('nom');
            $table->string('prenom');
            $table->string('adresse');
            $table->integer('cp');
            $table->string('ville');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->tinyInteger('admin')->nullable();
        });

    Schema::table('users', function ($table) {
        $table->integer('sexe_id')->unsigned();
        $table->foreign('sexe_id')->references('id')->on('sexes');
    });
}

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

Моя половая миграция:

/**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sexes', function (Blueprint $table) {
            $table->increments('id');
            $table->string('libelle');
            $table->timestamps();
        });    
    }

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

Сеялка моего пола:

class SexesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('sexes')->insert([
            [
                'libelle' => 'Homme',
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
            ],
            [
                'libelle' => 'Femme',
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
            ]
        ]);    
    }
}

Сеялка моих пользователей:

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            [
                'name' => 'admin',
                'nom' => 'Virlois',
                'prenom' => 'Peter',
                'sexe_id' => 1,
                'email' => '[email protected]',
                'adresse' => '12 rue Jean Rostand',
                'cp' => 90000,
                'ville' => 'Belfort',
                'password' => bcrypt('admin123'),
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
                'admin' => 1,
            ],
            [
                'name' => 'test',
                'nom' => 'Mennegain',
                'prenom' => 'Mathieu',
                'sexe_id' => 1,
                'email' => '[email protected]',
                'adresse' => '12 rue Jean Rostand',
                'cp' => 90000,
                'ville' => 'Belfort',
                'password' => bcrypt('test123'),
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
                'admin' => 0,
            ]
        ]);
    }
}

Моя сеялка базы данных:

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(SexesTableSeeder::class);
        $this->call(UsersTableSeeder::class);
        $this->call(SaisonTableSeeder::class);
        $this->call(ProduitTypeSeeder::class);
        $this->call(SportsTableSeeder::class);
        $this->call(ProduitsTableSeeder::class);
    }
}

Когда я запускаю: php artisan migrate: refresh -seed

У меня такая ошибка:

 [Illuminate\Database\QueryException]                                         
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL  
  : alter table `users` add constraint `users_sexe_id_foreign` foreign key (`  
  sexe_id`) references `sexes` (`id`))                                         



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

person Peter Artoung    schedule 14.11.2016    source источник
comment
убедитесь, что ваша СУБД InnoDB, MyISAM не поддерживает внешние ключи.   -  person shoieb0101    schedule 14.11.2016


Ответы (2)


Порядок миграций очень важен. Из того, что вы опубликовали, вы сначала запускаете миграцию пользователей, и в той же миграции вы пытаетесь создать таблицу пользователей и изменить таблицу. другая таблица sexes не существует

($table->foreign('sexe_id')->references('id')->on('sexes');)

вот почему вы получаете сообщение об ошибке.

Я предлагаю разделить миграции, чтобы запускать пользователей, полы, изменять пользователей или полы, пользователей и изменять в одной и той же миграции, но это не лучший способ делать что-то, я имею в виду смешивать миграции (создавать и изменять).

person Morpheus_ro    schedule 14.11.2016

Вероятно, нет ничего, что id 1 в sexes таблице и sexe_id => 1 генерирует эту ошибку. В вашем UsersTableSeeder, а не в жестком коде 'sexe_id' => 1 запросите вашу sexes таблицу для любой строки и используйте эту динамическую id.

person Mahfuzul Alam    schedule 14.11.2016