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?
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);
}
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.
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');
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.