Laravel 查询构建器将 id 设置为 0 无效

Laravel query builder setting id to 0 not working

我正在播种类别 table,当我 运行:

    DB::table('cats')->insert([
        'id' => 0,
        'parent_cat_id' => null,
        'name' => 'Uncategorized'
    ]);

但是插入的行的 id 将为 1,如果我尝试在 db 上手动更新 id 这是可能的。

除零以外的任何值都适用于查询生成器(例如 'id'=>5

编辑: 目前这个 hack 正在工作,如果 update() 可以将 id 更改为 0insert() 有什么问题?

    DB::table('cats')->insert([
        'id' => 100,
        'parent_cat_id' => null,
        'name' => 'Uncategorized'
    ]);
    DB::table('cats')->where('id',100)->update(['id' => 0]);

我的迁移架构:

    Schema::create('cats', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->unsignedInteger('parent_cat_id')->nullable();
    });

您似乎定义了 id 列:

$table->increments('id');

相当于UNSIGNED INTEGER

https://laravel.com/docs/5.4/migrations

更新

要创建自动递增非无符号字段,请执行以下操作:

$table->integer('id');
$table->primary('id');

Eloquent assumes that the primary key is an incrementing integer value, which means that by default the primary key will be cast to an int automatically.

https://laravel.com/docs/5.3/eloquent#eloquent-model-conventions

更改您的迁移文件。然后使用命令 - php artisan migrate

public function up()
{
    Schema::create('table_name', function (Blueprint $table) {
        $table->increments('id');
        $table->string('email')->index();
        $table->string('token')->index();
        $table->timestamp('created_at');
    });

我用这个解决了:

public function up()
{
   Schema::create('cats', function (Blueprint $table) {
       DB::statement('SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";');
       //run other migrations 
   }
}

sql_mode MySQL 变量告诉 MySQL 是否应该将 0 INSERT 解释为真正的 0,而不是 PRIMARY KEY 生成请求。