Laravelを初めて使用し、Schema
ファサードを使用してテーブルを作成しようとしています。コマンドを使用して移行ファイルを作成します。
php artisan make:migration create_products_define_standards_table --create=products_define_standards
ファイルは次のとおりです。
<?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');
}
}
実際には、デフォルトのCreateUsersTable
とほぼ同じ内容ですが、php artisan migrate
を実行すると、次のようになります。
users
'テーブル(デフォルト)migrations
'テーブル(デフォルト)しかしnot:
password_resets
'テーブル(デフォルト)products_define_standards
'テーブル(カスタム)php artisan migrate:fresh
で試しましたが、同じログが表示されます。
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
この回答 を見つけ、composer dumpauto
も実行しましたが、結果は同じです。
私は何かが足りないのですか?移行を別の場所に登録するために他に何かする必要がありますか?
_AppServiceProvider.php
_ディレクトリにある_app/Providers
_を編集し、boot()
メソッド内でデフォルトの文字列長を設定します。
_use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
_
バージョン5.6では、2つのファイルを編集する必要があります。
最初
App/ProvidersディレクトリにあるAppServiceProvider.phpを編集し、boot()メソッド内でデフォルトの文字列の長さを設定します。
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
秒
Config /database.phpディレクトリにあるdatabase.phpを編集します
mysql構成セクションの「engine」はnullであり、「InnoDB ROW_FORMAT=DYNAMIC
」に置き換える必要があります
楽しんでいただければ幸いです。
ここでの作業は、キー名(短いもの)を使用して2番目のパラメーターを渡すというアプローチでした。
$table->string('code')->unique(null,'unikcode');
この問題に対する潜在的なより良い解決策を提案したいと思います。
Laravelの一部であるファイルを編集する必要はありません。代わりに、実際のデータベース照合順序とエンジンを編集してください。
MySQLまたはMariaDBのいずれかを使用していると思います。 phpMyAdminを使用し、空のデータベースを作成するときは、utf8mb4_unicode_ciを使用します(utf8_unicode_ciまたはutf8P_general_ciも正常に機能する場合があります)。
次に、デフォルトのデータベースエンジンをMyISAMではなくInnoDBに設定します(これは、phpMyAdminの[変数]タブでも実行できます。「エンジン」を検索してください。
人々が提案した他のソリューション-つまり、database.phpを編集してInnoDBを使用するようにすると、非常によく似た効果があります。しかし、MySQL/Mariaの最新バージョンshouldとにかく、箱から出してすぐにInnoDBを使用しています。
移行を実行すると、それ以上の変更を加えることなく正常に実行されます。