我有一个名为support_tags
的数据库列。这是一个jsonb列,它包含一个简单的数组,如下所示:
[
"caring",
"budgets",
"careers_employment",
"addictions"
]
我试图使用以下内容查询该列:
$services = \App\Models\Service::where("status", "accepted")->whereRaw("JSON_CONTAINS(support_tags, '" . json_encode($categories) . "')")->get();
这不能检索我希望/期望的结果。如果我发送以下数组:
[
"caring",
"smoking"
]
返回的结果是包含所有数组元素的服务。我需要它更像一个whereIn
,因为不是所有的数组值都需要出现在数据库列中,而是一个或多个。如果有人知道怎么做,我会非常感激的。谢谢。
发布于 2021-12-06 11:23:42
您可以使用以下出色的方法:->whereJsonContains()
和->orWhereJsonContains()
您的查询如下:
$services = \App\Models\Service::where("status", "accepted")
->where(function($query) {
$query->whereJsonContains('support_tags', 'smoking')
->orWhereJsonContains('support_tags', 'caring');
});
发布于 2021-12-06 11:31:49
在我接受这个问题的另一个答案之前,我认为分享我基于公认答案的实现可能是有益的
$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;
https://stackoverflow.com/questions/70244493
复制相似问题