首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel:查询包含数组的JSON列,期望得到与"whereIn“类似的结果

Laravel:查询包含数组的JSON列,期望得到与"whereIn“类似的结果
EN

Stack Overflow用户
提问于 2021-12-06 11:06:36
回答 2查看 193关注 0票数 1

我有一个名为support_tags的数据库列。这是一个jsonb列,它包含一个简单的数组,如下所示:

代码语言:javascript
运行
复制
[
    "caring", 
    "budgets", 
    "careers_employment", 
    "addictions"
]

我试图使用以下内容查询该列:

代码语言:javascript
运行
复制
$services = \App\Models\Service::where("status", "accepted")->whereRaw("JSON_CONTAINS(support_tags, '" . json_encode($categories) . "')")->get();

这不能检索我希望/期望的结果。如果我发送以下数组:

代码语言:javascript
运行
复制
[
    "caring",
    "smoking"
]

返回的结果是包含所有数组元素的服务。我需要它更像一个whereIn,因为不是所有的数组值都需要出现在数据库列中,而是一个或多个。如果有人知道怎么做,我会非常感激的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-06 11:23:42

您可以使用以下出色的方法:->whereJsonContains()->orWhereJsonContains()

您的查询如下:

代码语言:javascript
运行
复制
$services = \App\Models\Service::where("status", "accepted")
    ->where(function($query) {
        $query->whereJsonContains('support_tags', 'smoking')
            ->orWhereJsonContains('support_tags', 'caring');
    });    
票数 2
EN

Stack Overflow用户

发布于 2021-12-06 11:31:49

在我接受这个问题的另一个答案之前,我认为分享我基于公认答案的实现可能是有益的

代码语言:javascript
运行
复制
$categories = request()->infoAdviceCategories;

$services = [];

if (count($categories)) {
    $services = \App\Models\Service::where("status", "accepted")->whereJsonContains("support_tags", $categories[0]);

    foreach ($categories as $category) {
        if ($category !== $categories[0]) {
            $services->orWhereJsonContains("support_tags", $category);
        }
    }

    $services = $services->get();
}

return $services;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70244493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档