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

Laravel: Querying JSON column containing array, expecting similar results to "whereIn"

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

[
    "caring", 
    "budgets", 
    "careers_employment", 
    "addictions"
]

我正在尝试使用以下内容查询此列:

$services = \App\Models\Service::where("status", "accepted")->whereRaw("JSON_CONTAINS(support_tags, '" . json_encode($categories) . "')")->get();

这没有检索到我希望的结果 for/expecting。如果我发送以下数组:

[
    "caring",
    "smoking"
]

我得到的结果是包含所有个数组元素的服务。我需要它更像 whereIn,因为并非所有数组值都需要出现在数据库列中,而是一个或多个。如果有人知道这样做的方法,我将不胜感激。谢谢。

您可以使用这些 eloquent 方法:->whereJsonContains()->orWhereJsonContains()

您的查询将是这样的:

$services = \App\Models\Service::where("status", "accepted")
    ->where(function($query) {
        $query->whereJsonContains('support_tags', 'smoking')
            ->orWhereJsonContains('support_tags', 'caring');
    });    
    

就在我接受这个问题的其他答案之前,我认为分享我基于已接受答案的实现可能会很有用这就是诀窍:

$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;