Laravel 5.6: Не удалось создать таблицу
Я новичок в 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
таблица (по умолчанию)
Но не:
-
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
, но результат тот же.
Я что-то упускаю? Должен ли я сделать что-либо еще, чтобы зарегистрировать миграцию в другом месте?
4 answers
Отредактируйте свой AppServiceProvider.php
, расположенный в каталоге app/Providers
, и внутри метода boot()
установите длину строки по умолчанию.
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
В версии 5.6 вы должны отредактировать 2 файла:
Первый
Отредактируйте свой AppServiceProvider.php находится в каталоге приложений/поставщиков и внутри метода boot() задает длину строки по умолчанию.
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Второй
Отредактируйте свой database.php расположенный в config/database.php каталог
В разделе конфигурации mysql "движок" равен нулю, и вы должны заменить на 'InnoDB ROW_FORMAT=DYNAMIC
'
Надеюсь, вам понравится.
Подход, который здесь работал, состоял в том, чтобы передать второй параметр с именем ключа (коротким):
$table->string('code')->unique(null,'unikcode');
Я хотел бы предложить потенциально лучшее решение этой проблемы.
Вам не нужно редактировать какие-либо файлы, которые являются частью вашего Laravel. Вместо этого отредактируйте ваши фактические параметры сортировки и механизм базы данных.
Я предполагаю, что вы используете либо MySQL, либо MariaDB. Используйте phpMyAdmin, при создании пустой базы данных используйте utf8mb4_unicode_ci (utf8_unicode_ci или utf8p_general_ci также могут работать нормально).
Затем установите ядро базы данных по умолчанию на InnoDB вместо MyISAM (вы можете сделать это также в phpMyAdmin на вкладке "Переменные" найдите "движок".
Другие решения, которые предложили люди, т.е. Редактирование database.php чтобы заставить его использовать InnoDB в любом случае, получите очень похожий эффект. Но современные версии MySQL/Maria должны в любом случае использовать InnoDB из коробки.
Запустите миграцию, и она будет выполнена нормально без дальнейших изменений.