Как установить Laravel с более старыми версиями MariaDB и MySQL? (Исключение при запуске миграции) - PullRequest
0 голосов
/ 02 ноября 2018

Задача
С первой попытки, когда я попытался запустить свой первый migrate, все уже очень плохо. Зачем? Потому что я сразу начинаю с сообщения об ошибке, которого никогда не видел, потому что я не был знаком с Laravel (или другими фреймворками). Сообщение об ошибке выглядит следующим образом:

[Осветите \ Database \ QueryException] SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт (SQL: пользователи таблицы изменения могут добавлять уникальные users_email_unique (email))

[PDOException] SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа 767 байт

Когда я впервые увидел эти исключения, я ожидал, что разрушил все приложение.

Как я могу решить эту проблему и обойти (или решить) это?

1 Ответ

0 голосов
/ 02 ноября 2018

Вопрос
Этот вопрос касается Laravel и почему его так сложно установить на веб-сервер с MariaDB (ниже 10.2.2) или MySQL (ниже 5.7.7). Возможно, вы даже не сможете запустить первую миграцию.

Причина
Laravel по умолчанию использует набор символов utf8mb4, который включает поддержку для хранения «emojis» в базе данных. Если вы используете версию MySQL, более раннюю, чем версия 5.7.7, или MariaDB, более раннюю, чем версия 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, создаваемую миграциями, чтобы MySQL создавал для них индексы.
(слово в слово копируется из Документация Laravel )

Решение
Сначала ошибки / исключения выглядят так, что ваша база данных MySQL / MariaDB не поддерживается приложением. Нужно ли что-то менять? Нужно ли что-то настраивать?

Решение простое. В соответствии с документацией Laravel, упомянутой в разделе «Причина», вам необходимо указать свой defaultStringLength, которым управляет Schema.

Вам необходимо отредактировать файл в вашей установке Laravel, который находится по адресу app/Providers/AppServiceProvider.php

Страница по умолчанию выглядит следующим образом:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Вам нужно всего лишь изменить два правила.

  1. В usings необходимо добавить Schema
    use Illuminate\Support\Facades\Schema;
  2. Вам необходимо указать defaultStringLength в методе загрузки
    Schema::defaultStringLength(191);

После изменений код должен выглядеть следующим образом:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Это скажет вашим миграциям, как обращаться с defaultStringLength и что с ним делать. После этого дополнения вы сможете запустить свой первый php artisan migrate и начать создавать классные вещи!

...