Laravel 5 Migration Erreur en relation de Clé Étrangère

C'est une tentative d'apprendre Laravel (plus précisément v5.x) par le portage d'un vieux projet à l'aide d'un dump SQL qui contient ceci:

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `locationid` int(11) NOT NULL,
  `username` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `email` varchar(200) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `firstname` varchar(100) NOT NULL,
  `lastname` varchar(100) NOT NULL,
  `password` varchar(255) NOT NULL,
  `active` bit(1) DEFAULT b'1',
  `token` varchar(100) DEFAULT NULL,
  `token_created` timestamp NULL DEFAULT NULL,
  `role` varchar(45) NOT NULL DEFAULT 'user',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_UNIQUE` (`email`),
  UNIQUE KEY `username_UNIQUE` (`username`),
  KEY `location_idx` (`locationid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

Et au bas de la décharge a ce lié à ce tableau:

ALTER TABLE `user`
  ADD CONSTRAINT `location_userfk` FOREIGN KEY (`locationid`) REFERENCES `location` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

À partir d'un couple stackoverflow questions Un, Deux, Trois; j'ai modifié mon code d'origine pour séparer la clé étrangère de Schéma::table de Schéma::créer et ajouté unsigned() pour chacun des champs:

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('locationid')->unsigned();
        //$table->foreign('locationid')->references('id')->on('location');
        $table->string('username', 60)->unique();
        $table->string('email', 200)->unique();
        $table->string('firstname', 100);
        $table->string('lastname', 100);
        $table->string('password', 255);
        $table->boolean('active')->default(TRUE);
        $table->string('role', 45)->default('user');
        //$table->string('token', 255)->nullable()->default(NULL);
        //$table->string('token_create')->nullable()->default(NULL);
        $table->rememberToken();
        $table->timestamps();
    });

    Schema::table('users', function(Blueprint $table) 
    {
        $table->foreign('locationid')->references('id')->on('location');
    });
}

Mais j'ai toujours une erreur quand j'ai migrer lors de l'utilisation d'un vide nouvellement créé DB:

exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint' in /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php:358
Stack trace:
#0 /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php(358): PDOStatement->execute(Array) etc...

Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[HY000]: General err
or: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint users_loca
tionid_foreign foreign key (`locationid`) references `location` (`id`))' in /home/vagrant/proj
ects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php:614   
Stack trace:                                                                                  
#0 /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php(570): Illuminate\Database\Connection->runQueryCallback('alter table `us...', Ar
ray, Object(Closure))

Qui, selon MySQL signifie:

Error: 1215 SQLSTATE: HY000 (ER_CANNOT_ADD_FOREIGN)
Message: Cannot add foreign key constraint                                         

Après laquelle je ne peux pas rollback ou de migrer de nouveau sans avoir à obtenir un autre type d'erreur quant à l'existence de la table des utilisateurs déjà dans la base de données de sorte que chaque fois que j'essaie une version du code ci-dessus, j'ai été déposer mon DB à chaque fois.

Je suis sûr que, après la fixation de ce qu'il va se produire dans tous les autres tableaux, qui sont similaires ou avoir plus d'une clé étrangère, alors j'espère que ce que résout ce travail pour le reste.

  • Est le location tableau déjà créé?
  • Vous devez créer emplacement de la table avant d'ajouter la clé étrangère.
  • Pour moi, je énumérer la migration des fichiers. Et puis utiliser l'artisan migrer les commandes pour générer de nouvelles migrations.
  • comment définissez-vous l'ordre des tables en cours de migration? Il semble que vous ne pourrions le faire en faisant un seul fichier de migration et de créer plusieurs tables dans un seul fichier, ou plus précisément l'adaptation de la migration initiale, ce qui serait plus difficile pour les autres développeurs à imiter. A été l'espoir d'être en mesure d'installer, de créer db, compositeur installer, artisan de migrer et de l'artisanat de la graine pour obtenir d'autres devs et en cours d'exécution
  • Pour moi, je énumérer les fichiers 2014_10_29_[1...100]_create... puis-je créer la poursuite de la migration de fichiers via l'artisan de commande.
  • Je vois, merci

InformationsquelleAutor mtpultz | 2015-02-17