如何在Laravel的Seeder中为JSON类型ibans字段写入银行名称和IBAN数据
Laravel Seeder写入JSON类型字段的正确实现方法
核心错误原因
- 当前代码传入
json_decode的字符串不是合法JSON格式,缺少外层{}包裹,解析后直接返回null,导致字段写入失败 - 直接使用
DB门面操作数据表时,不会自动将PHP数组序列化为JSON字符串,需要手动处理
正确实现方案
方案1:直接使用DB门面写入(无需修改其他代码)
直接构造符合业务需求的PHP数组,再用json_encode转为合法JSON字符串即可,示例代码如下:
public function run() { DB::table('settings')->insert([ 'name' => 'Şirket Ünvanı', 'account_type' => 'settings', // 先构造银行名称与对应IBAN的数组,再转为JSON字符串 'ibans' => json_encode([ '工商银行' => 'IBAN12345678901234', '建设银行' => 'IBAN98765432109876' // 可按需求添加更多银行与对应IBAN信息 ], JSON_UNESCAPED_UNICODE), // 该参数避免中文被转义 'created_at' => now(), 'updated_at' => now(), ]); }
方案2:使用模型自动转换(更规范的Laravel写法)
- 首先创建对应的
Setting模型,在模型中添加$casts属性指定ibans字段为数组类型,Laravel会自动在读写时完成JSON和数组的互转:
// app/Models/Setting.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Setting extends Model { protected $fillable = [ 'name', 'account_type', 'ibans' ]; protected $casts = [ 'ibans' => 'array' // 指定JSON字段自动转为数组处理 ]; }
- 然后Seeder中直接调用模型的
create方法传数组即可:
use App\Models\Setting; public function run() { Setting::create([ 'name' => 'Şirket Ünvanı', 'account_type' => 'settings', // 直接传数组即可,Laravel会自动转JSON存储 'ibans' => [ '工商银行' => 'IBAN12345678901234', '建设银行' => 'IBAN98765432109876' ], 'created_at' => now(), 'updated_at' => now(), ]); }
内容的提问来源于stack exchange,提问作者lidersin
相关产品推荐
相关产品推荐

