Я новичок в 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
но результат тот же.
Я что-то пропустил? Должен ли я сделать что-нибудь еще, чтобы зарегистрировать миграцию где-нибудь еще?
Отредактируйте свой AppServiceProvider.php
находится в app/Providers
каталог, а внутри boot()
Метод устанавливает длину строки по умолчанию.
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
В версии 5.6 вы должны отредактировать 2 файла:
Первый
Отредактируйте ваш AppServiceProvider.php, расположенный в каталоге app / Providers, и в методе boot () установите длину строки по умолчанию.
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
второй
Отредактируйте ваш файл database.php, расположенный в каталоге config / database.php
в разделе конфигурации mysql ‘engine’ равен null, и его следует заменить на ‘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 из коробки в любом случае.
Запустите миграцию, и она будет работать нормально без дальнейших изменений.