web-dev-qa-db-fra.com

Laravel 5.6: La création de la table a échoué

Je suis nouveau à Laravel et j'essaie de créer des tables en utilisant la façade Schema. Je crée le fichier de migration avec la commande

php artisan make:migration create_products_define_standards_table --create=products_define_standards

Voici le fichier:

<?php

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

class CreateStandardsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products_define_standards', function (Blueprint $table) {
            $table->increments('id');
            $table->string('code')->unique();
            $table->string('image');
            $table->timestamps();
        });
    }

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

Il contient pratiquement le même contenu que la valeur par défaut CreateUsersTable, mais lorsque je lance php artisan migrate, il crée:

  • users 'table (par défaut)
  • migrations 'table (par défaut)

mais pas:

  • password_resets 'table (par défaut)
  • products_define_standards 'table (personnalisé)

J'ai essayé avec php artisan migrate:fresh mais je reçois le même journal:

Dropped all tables successfully.
Migration table created successfully.

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

  at /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php: 664
  660:         // If an exception occurs when attempting to run a query, we'll format the error
  661:         // message to include the bindings with SQL, which will make this exception a
  662:         // lot more helpful to the developer instead of just the database's errors.
  663:         catch (Exception $e) {
  664:             throw new QueryException(
  665:                 $query, $this->prepareBindings($bindings), $e
  666:             );
  667:         }
  668: 
  669:         return $result;

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")
      /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php : 458

  2   PDOStatement::execute()
      /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php : 458

J'ai trouvé cette réponse et je lance aussi composer dumpauto mais le résultat est le même.

Est-ce que je manque quelque chose? Devrais-je faire autre chose pour enregistrer la migration ailleurs?

3
Brigo

Modifiez votre AppServiceProvider.php situé dans le répertoire app/Providers et définissez une longueur de chaîne par défaut dans la méthode boot().

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
9
Sapnesh Naik

Dans la version 5.6, vous devriez éditer 2 fichiers:

Premier

Modifiez votre AppServiceProvider.php situé dans le répertoire app/Providers et, dans la méthode boot (), définissez une longueur de chaîne par défaut.

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Seconde

Editez votre database.php situé dans le répertoire config/database.php

dans la section de configuration mysql, 'engine' est nul et vous devez le remplacer par 'InnoDB ROW_FORMAT=DYNAMIC

espérons que vous apprécierez.

1
Farhad

Le travail abordé ici consistait à passer un deuxième paramètre avec le nom de clé (un nom court):

$table->string('code')->unique(null,'unikcode');
0
Tiago Gouvêa

Je voudrais proposer une meilleure solution potentielle à ce problème.

Vous n'êtes pas obligé de modifier les fichiers qui font partie de votre Laravel. Modifiez plutôt le classement et le moteur de votre base de données.

Je présume que vous utilisez MySQL ou MariaDB. Utilisez phpMyAdmin, lorsque vous créez une base de données vierge, utilisez utf8mb4_unicode_ci (utf8_unicode_ci ou utf8P_general_ci peut également fonctionner correctement).

Ensuite, définissez votre moteur de base de données par défaut sur InnoDB à la place de MyISAM (vous pouvez le faire également dans phpMyAdmin sous l'onglet "Variables", recherchez "moteur".

Les autres solutions proposées par les utilisateurs, à savoir éditer database.php pour qu’il utilise de toute façon InnoDB, ont un effet très similaire. Mais les versions modernes de MySQL/Maria devraient utilisent de toute façon InnoDB.

Exécutez votre migration et elle s'exécutera correctement sans autre modification.

0
Psipherious