Странная ошибка, возникающая при выполнении первой миграции в Laravel 8, тянется ещё со времён Laravel 5.4. И её почему-то до сих пор не устранили. Связано ли это с тем, что программисты, работающие с Laravel, предпочитают исключительно MySQL и люто ненавидят MariaDB, или ещё по какой причине, но ошибка случается и поправить её на самом деле, не составляет труда.
Ошибка выглядит следующим образом. При выполнении команды:
php artisan migrate
Миграции начинают обрабатываться:
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Но тут же вылетает сообщение об ошибке:
Illuminate\Database\QueryException
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
667▕ // If an exception occurs when attempting to run a query, we'll format the error
668▕ // message to include the bindings with SQL, which will make this exception a
669▕ // lot more helpful to the developer instead of just the database's errors.
670▕ catch (Exception $e) {
➜ 671▕ throw new QueryException(
672▕ $query, $this->prepareBindings($bindings), $e
673▕ );
674▕ }
675▕
+9 vendor frames
10 database/migrations/2014_10_12_000000_create_users_table.php:26
Illuminate\Support\Facades\Facade::__callStatic("create")
+21 vendor frames
32 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
Решение проблемы с ошибкой php artisan migrate
— SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes при применении миграции в Laravel
Для устранения этой ошибки нужно внести изменения в метод boot
класса AppServiceProvider
. Для этого открываем файл, находящийся по адресу:
/папка_проекта/app/Providers/AppServiceProvider.php
Изначально он имеет вид:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
}
В него нужно вписать 2 строчки (использование библиотеки фасадов use Illuminate\Support\Facades\Schema;
и модификацию метода boot
: Schema::defaultStringLength(191);
) таким вот образом:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Таким образом модифицированный файл с классом AppServiceProvider
будет иметь вид (добавляется 6-я и 26-я строки):
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
}
После сохранения этих изменений, команда php artisan migrate
работает без ошибок, все миграции применяются и проект на фреймворке Laravel оживает. =)
Важно(!)
Перед тем, как накатывать повторно миграции, удалите созданные ранее таблицы из базы данных.
Иначе будет новая ошибка! ;)
По материалам:
laravel-news.com
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)