如何在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
相关产品推荐
相关产品推荐

