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

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:

  1. 先确保模型已正确配置类型转换:
class Thread extends Model
{
    protected $casts = [
        'phone_numbers' => 'array',
    ];
}
  1. 读取记录时,$thread->phone_numbers会自动转为数组;保存/更新时,直接传数组,模型会自动转换成标准JSON字符串存入数据库,不会出现转义问题。
  2. 查询时必须用Laravel的JSON专用查询方法(whereJsonEquals/whereJsonContains等),这些方法会自动把你传入的数组转换成和数据库存储格式一致的JSON,避免手动编码导致的匹配失败或重复创建。

内容的提问来源于stack exchange,提问作者Phil Tune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:56:00