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

如何用Eloquent从JSON字段中检索指定键的匹配值?

解决Laravel中JSON字段模糊匹配的问题

你当前的写法存在问题,whereJsonContains是用来精确匹配JSON数组元素或JSON键对应值的,不能直接在其中嵌套like条件。要实现JSON字段里author键的模糊搜索,可以用以下两种方法:

方法一:用Laravel原生where方法(推荐)

Laravel 5.6及以上版本支持通过->语法直接指定JSON字段的键,结合like操作符就能实现模糊匹配:

// 基础写法
$query = Book::where('book_details->author', 'like', "%{$search}%")->get();

// 更安全的参数绑定写法(避免SQL注入)
$query = Book::where('book_details->author', 'like', DB::raw('concat("%", ?, "%")'), [$search])->get();

这种写法会由Laravel自动根据你使用的数据库(MySQL/PostgreSQL等)转换为对应的JSON查询语法,兼容性更强。

方法二:用whereRaw自定义SQL语句

如果需要更灵活的控制,可以直接编写原生SQL,借助数据库的JSON函数实现:

MySQL环境:

$query = Book::whereRaw('book_details->>"$.author" LIKE ?', ["%{$search}%"])->get();

这里book_details->>"$.author"是MySQL提取JSON字段book_details中author键字符串值的语法,搭配LIKE完成模糊匹配。

PostgreSQL环境:

$query = Book::whereRaw('book_details->>\'author\' LIKE ?', ["%{$search}%"])->get();

PostgreSQL的JSON字段取值语法和MySQL略有差异,注意引号的使用方式。

补充说明

whereJsonContains的正确使用场景是精确匹配,比如你要查找author数组中包含特定作者的记录:

// 示例:匹配book_details->author数组中包含"张三"的书籍
$query = Book::whereJsonContains('book_details->author', '张三')->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:01:18