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, но результат тот же.

Я что-то упускаю? Должен ли я сделать что-либо еще, чтобы зарегистрировать миграцию в другом месте?

Author: Brigo, 2018-02-12

4 answers

Отредактируйте свой AppServiceProvider.php, расположенный в каталоге app/Providers, и внутри метода boot() установите длину строки по умолчанию.

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
 8
Author: Sapnesh Naik, 2018-02-12 10:52:54

В версии 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'

Надеюсь, вам понравится.

 0
Author: Farhad, 2018-06-06 12:20:15

Подход, который здесь работал, состоял в том, чтобы передать второй параметр с именем ключа (коротким):

$table->string('code')->unique(null,'unikcode');
 0
Author: Tiago Gouvêa, 2018-07-24 13:25:54

Я хотел бы предложить потенциально лучшее решение этой проблемы.

Вам не нужно редактировать какие-либо файлы, которые являются частью вашего Laravel. Вместо этого отредактируйте ваши фактические параметры сортировки и механизм базы данных.

Я предполагаю, что вы используете либо MySQL, либо MariaDB. Используйте phpMyAdmin, при создании пустой базы данных используйте utf8mb4_unicode_ci (utf8_unicode_ci или utf8p_general_ci также могут работать нормально).

Затем установите ядро базы данных по умолчанию на InnoDB вместо MyISAM (вы можете сделать это также в phpMyAdmin на вкладке "Переменные" найдите "движок".

Другие решения, которые предложили люди, т.е. Редактирование database.php чтобы заставить его использовать InnoDB в любом случае, получите очень похожий эффект. Но современные версии MySQL/Maria должны в любом случае использовать InnoDB из коробки.

Запустите миграцию, и она будет выполнена нормально без дальнейших изменений.

 0
Author: Psipherious, 2018-09-06 23:07:34