升级到 laravel 6.0 - 由于 "default" 方法,工作迁移现在失败,可能是 MariaDB 问题

Upgraded to laravel 6.0 - working migration now fails because of "default" method, might be a MariaDB problem

我想知道我是否应该在 Laravel github 上打开一个问题,但我不确定这是一个 Laravel 问题,也许是 Eloquent 或 MariaDB .

问题
我最近升级到 Laravel 6.0。当我尝试重新安装我的项目(使用空数据库)并执行 php artisan migrate 时,第一次迁移失败。该文件仅包含一个 table 创建:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('ltm_translations', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('status')->default(0);
        $table->string('locale');
        $table->string('group');
        $table->string('key');
        $table->text('value')->nullable();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('ltm_translations');
}

而错误是因为生成了错误的SQL。第二列的 ->default(0) 被翻译成 status int not null default ('0')

那个圆括号导致我的数据库抛出异常。这是生成的完整 SQL(从错误消息中提取)。

create table `ltm_translations` (`id` int unsigned not null auto_increment primary key, `status` int not null default ('0'), `locale` varchar(255) not null,
  `group` varchar(255) not null, `key` varchar(255) not null, `value` text null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8 collate 'utf8_bin' engine = innodb`

如果我复制粘贴此查询并将 ('0') 替换为 0,它会起作用。
(0)('0') 失败。

official documentation 告诉我这是一个带有表达式等的有效语法,但它提到了一些关于 10.2 版本的内容。

我的MariaDB版本回复:

mariadb --version
mariadb  Ver 15.1 Distrib 10.1.40-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

问题
是我的 MariaDB 版本问题吗?
我可以强制 Eloquent 生成与我的 MariaDB 版本兼容的语法,还是我必须将 mariaDB 升级到 10.2+?

由于生产 OS 版本 (Ubuntu 18.04) 未正式支持此功能,这将是一个可怕的问题,欢迎任何与生产服务器兼容的解决方案。

感谢您的宝贵时间!

从 laravel 6.0.3

开始工作

此问题已通过 laravel 6.0.3

修复

6.0.3 之前的工作组合

  • Laravel 5.8 mysql 5.7.27 有效
  • Laravel 6.0.2 mysql 5.7.27 不起作用
  • Laravel 6.0.2 mysql 8.0.13 有效

在修复此问题之前,您似乎可以将 Laravel 降级到 5.8 或将 mysql 升级到 8。

正在使用 docker

在您的开发机器上升级到 mysql 8

如果您决定升级到 mysql 8.0.13,请务必设置 default-authentication-plugin=mysql_native_password。那是 AFAIK php 问题,而不是 laravel 问题。

供您参考:

$ ls -l
drwxrwxr-x 7 thomas thomas 4096 Sep 11 10:28 data
-rw-rw-r-- 1 thomas thomas   61 Sep 11 10:11 php-compatible-password.cnf
-rwxrw-r-- 1 thomas thomas  316 Sep 11 10:14 start.sh

php-兼容-password.cnf:

[mysqld]
default-authentication-plugin=mysql_native_password

start.sh:

#!/usr/bin/env bash

docker run --rm -v "$PWD/php-compatible-password.cnf":/etc/mysql/conf.d/php-compatible-password.cnf -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name mydb-mysql8 -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=homestead -e MYSQL_USER=homestead -e MYSQL_PASSWORD=secret -d mysql:8

laravel.env:

…
DB_CONNECTION=mysql
DB_HOST=172.17.0.2
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
…

其中 172.17.0.2 是

的结果
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mydb-mysql8