首页 > 解决方案 > Laravel 使用 SQL LIKE 运算符过滤 JSON 数据

问题描述

代码

 //text to search   
     $details  = "Successfully";
        
        ActivityLog::with('getCauserDetails')
        ->when($details ?? false, function ($q) use ($details) {
            $q->whereJsonContains('properties->activity', $details);
        })
        ->get()
        ->toArray();

表结构

id          - int
name        - varchar
properties  - json
user_id     - int

json数据

{
   "ip":"192.168.0.1",
   "platform":"Windows",
   "activity":"Successfully logout"
}

{
   "ip":"192.168.0.1",
   "device":"WebKit",
   "browser":"Chrome",
   "platform":"Windows",
   "activity":"Successfully logged in"
}

问题:以上代码已经成功搜索到JSON数据中的数据值,但需要搜索成完整的句子。例如,“注销成功”,如果我用“成功”语句搜索,它不会过滤数据。有谁知道如何使用 中的 SQL LIKE 运算符过滤它,这意味着如果JsonContains我用句子“成功”过滤,它也会返回数据而不是完整的句子。

标签: jsonlaraveleloquent

解决方案


我没有找到任何合适的 Laravel 方法,但您在 SQL 中的查询将是这样的。除了使用原始查询之外,您似乎别无选择:

SELECT * 
FROM table_name
WHERE JSON_EXTRACT(properties, "$.activity") LIKE '%Successfully logout%'

推荐阅读