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

Laravel检查数据库中是否存在指定字符串记录的问题

问题分析与解决方案

你的问题出在直接将JSON对象作为like查询条件,导致SQL语法错误,进而触发数据库连接相关的异常(实际是查询语句无效引发的框架报错)。以下是修复方案:

问题根源

原代码中,你把整个社交媒体JSON对象(比如{"id":"xxx","value":"testusername"})直接传入like条件,生成的SQL会包含无效语法(比如WHERE socialMedia like Array),数据库无法解析这个查询,最终抛出异常。

修复步骤

1. 修改模型查询方法

利用Laravel对JSON字段的原生支持,直接查询JSON中的value字段,而不是匹配整个JSON内容:

public static function alreadySubmit($formId, $socialMedia)
{
    // 提取社交媒体用户名
    $username = $socialMedia['value'];
    
    // 匹配form_id,同时检查JSON字段中的value是否重复
    return self::where('form_id', $formId)
        ->whereJsonContains('socialMedia->value', $username)
        ->exists();
}

如果你的Laravel版本较低(<5.6),不支持whereJsonContains,可以用原生SQL函数替代:

public static function alreadySubmit($formId, $socialMedia)
{
    $username = $socialMedia['value'];
    
    return self::where('form_id', $formId)
        ->whereRaw('JSON_EXTRACT(socialMedia, "$.value") = ?', [$username])
        ->exists();
}

2. 确保传入的JSON数据格式正确

在控制器中,先确认socialMedia是解析后的数组(Laravel默认会自动解析请求中的JSON为数组,但如果前端传的是字符串,需要手动解码):

$requestPerson = $request->all();
$socialMedia = $requestPerson['personInteraction']['socialMedia'];

// 若前端传入的是JSON字符串,先解码为数组
if (is_string($socialMedia)) {
    $socialMedia = json_decode($socialMedia, true);
}

if(Person::alreadySubmit($request->id, $socialMedia)) {
    return $this->badRequestResponder->validationError(['message' => '该用户名已被提交过!']);
}

额外建议

  • 如果你的socialMedia字段存储的是多个社交媒体账号(数组形式),whereJsonContains依然适用,它会检查数组中是否包含指定的value值。
  • 为了查询性能,可以考虑给JSON字段的value路径建立索引(比如MySQL的JSON_PATH索引)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:12