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;
我有一个名为 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;