Laravel Eloquent数组类型字段匹配查询及firstOrCreate使用问题
Laravel数组类型转换字段的查询匹配问题解决
1. 无需手动转数组为字符串的原生匹配方式
用Laravel自带的whereJsonEquals方法处理JSON字段的精准匹配,配合firstOrCreate就能正确命中已存在的记录,全程不用手动转JSON:
// 精准匹配phone_numbers数组,不存在则创建 $thread = Thread::whereJsonEquals('phone_numbers', ['13800138000', '13900139000']) ->firstOrCreate( // 若有其他查询条件,写在这里 ['topic' => '售后咨询'], // 新增记录时的字段,phone_numbers直接传数组,模型会自动转JSON ['phone_numbers' => ['13800138000', '13900139000'], 'status' => 'active'] );
如果需要复用这个查询逻辑,还可以给模型加个查询范围:
// Thread模型里添加 public function scopeWherePhoneNumbers($query, array $numbers) { return $query->whereJsonEquals('phone_numbers', $numbers); } // 调用时更简洁 $thread = Thread::wherePhoneNumbers(['13800138000', '13900139000']) ->firstOrCreate(['topic' => '售后咨询'], [...]);
2. 遵循Eloquent规范的数组转换方式
完全依赖模型的$casts属性自动处理数组与JSON的互转,不要手动调用json_encode/json_decode:
- 先确保模型已正确配置类型转换:
class Thread extends Model { protected $casts = [ 'phone_numbers' => 'array', ]; }
- 读取记录时,
$thread->phone_numbers会自动转为数组;保存/更新时,直接传数组,模型会自动转换成标准JSON字符串存入数据库,不会出现转义问题。 - 查询时必须用Laravel的JSON专用查询方法(
whereJsonEquals/whereJsonContains等),这些方法会自动把你传入的数组转换成和数据库存储格式一致的JSON,避免手动编码导致的匹配失败或重复创建。
内容的提问来源于stack exchange,提问作者Phil Tune
相关产品推荐
相关产品推荐

