Laravel初学者如何将数组插入数据库ingredient字段?
解决方案
注意:请确保你的
ingredient字段类型为json或者text,不要使用长度过短的varchar类型,避免存储时内容被截断。
你直接把PHP数组传入SQL语句会报错,SQL无法识别PHP原生数组格式,需要先把数组序列化为字符串再存入,最常用的是转成JSON格式,两种实现方式可选:
方式1:手动序列化后插入
把$items数组用json_encode()转为JSON字符串即可,同时建议你不要直接拼接SQL参数,会有SQL注入风险,用Laravel的参数绑定或者查询构造器更安全:
// 先把数组转成JSON字符串 $ingredientJson = json_encode($items); // 推荐用法1:查询构造器(自动处理参数绑定,避免注入) DB::table('tbl_contest')->insert([ 'name' => $name4, 'email' => $email4, 'phone' => $phone, 'category' => $cat, 'recp_name' => $rname, 'file' => $file, 'ingredient' => $ingredientJson, 'recp_desc' => $recp ]); // 如果你一定要用原生SQL,记得用参数绑定,不要直接拼接变量 DB::insert( "insert into tbl_contest (name, email, phone, category, recp_name, file, ingredient, recp_desc) values (?, ?, ?, ?, ?, ?, ?, ?)", [$name4, $email4, $phone, $cat, $rname, $file, $ingredientJson, $recp] );
后续你读取该字段的时候,用json_decode($ingredient, true)就能转回原来的数组格式使用。
方式2:用Eloquent模型自动序列化(更推荐)
如果你用Eloquent模型操作表,只需要在对应模型里添加$casts属性,Laravel会自动帮你完成数组和JSON的互转,不需要手动处理:
- 先创建对应
tbl_contest表的模型(比如叫Contest),在模型里添加字段类型转换:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Contest extends Model { protected $table = 'tbl_contest'; // 如果你的表里没有created_at、updated_at字段,关闭自动维护 public $timestamps = false; // 字段类型转换 protected $casts = [ 'ingredient' => 'array', // 存的时候自动转JSON,读取时自动转回数组 ]; // 允许批量赋值的字段 protected $fillable = [ 'name', 'email', 'phone', 'category', 'recp_name', 'file', 'ingredient', 'recp_desc' ]; }
- 插入的时候直接传数组即可:
Contest::create([ 'name' => $name4, 'email' => $email4, 'phone' => $phone, 'category' => $cat, 'recp_name' => $rname, 'file' => $file, 'ingredient' => $items, // 直接传数组就行,Laravel自动处理序列化 'recp_desc' => $recp ]);
后续读取的时候直接调用$contest->ingredient就能拿到数组格式的数据,不需要手动解码。
内容的提问来源于stack exchange,提问作者Fathima
相关产品推荐
相关产品推荐

