You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel迁移中添加array或json类型列并设置默认空值

Laravel 迁移新增JSON/Array类型列实现方案

错误写法原因说明

  • 第一种写法的$table->json('collabMail',['null','sai'])属于传参错误:json()方法的第二个参数仅在PostgreSQL环境下用于指定是否为jsonb类型,MySQL环境下传自定义属性数组无效,会导致列定义异常。
  • 第二种写法添加->change()方法是逻辑错误:change()方法用于修改已存在列的属性,新增列时添加该参数会导致迁移系统判定该列已存在,跳过新增逻辑,因此数据库不会生成对应列。

正确实现步骤

1. 编写迁移文件

首先执行命令生成新增列的迁移文件:
php artisan make:migration add_collab_mail_to_你的表名_table --table=你的表名

编辑迁移文件的逻辑:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    public function up()
    {
        Schema::table('你的表名', function (Blueprint $table) {
            // 方案A:数据库层默认空JSON数组,适配MySQL 5.7及以上版本
            $table->json('collabMail')->default(DB::raw('JSON_ARRAY()'))->nullable();
            
            // 方案B:兼容低版本数据库,不在数据库层设置默认,后续靠模型配置实现默认空值
            // $table->json('collabMail')->nullable();
        });
    }

    public function down()
    {
        Schema::table('你的表名', function (Blueprint $table) {
            $table->dropColumn('collabMail');
        });
    }
};

编写完成后执行迁移即可完成列新增:
php artisan migrate

2. 配置对应模型

在对应表的Eloquent模型中添加类型转换和默认值配置,实现自动序列化/反序列化,无需手动处理空值:

class 你的模型 extends Model
{
    // 配置JSON列自动转为数组
    protected $casts = [
        'collabMail' => 'array',
    ];
    
    // 如果用方案B的低版本兼容写法,添加以下配置设置默认空数组
    protected $attributes = [
        'collabMail' => [],
    ];
}

配置完成后,新增数据时如果不传collabMail参数,会自动存储为空JSON数组,传值时自动序列化后存储,读取时自动转为数组使用。

内容的提问来源于stack exchange,提问作者Code cracker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:24:02