无法让 MYSQL 正确查询 Laravel 中的 JSON 列

Cannot get MYSQL to query JSON column correctly in Laravel

我正在尝试使用 Laravel 查询 MYSQL 中的 JSON 列。当我知道应该有记录时,我无法让它拿起记录。

如果我从 Laravel 中提取后直接在 MySQL 中尝试,这就是我的 select 语句:

select `resources`.*, `users`.* from `resources` inner join `users` on `resources`.`user_id` = `users`.`id` where `status_id` = 3 and `resources`.`languages`->'$.""$"'.`name"` = English

我试着根据 MySQL 文档稍微清理一下:

select `resources`.*, `users`.* from `resources` inner join `users` on `resources`.`user_id` = `users`.`id` where `status_id` = 3 and `resources`.`languages`->"$.name" = "English"

我的实际 Laravel 代码是这样的:

        $query = DB::table('resources')
        ->join('users', 'resources.user_id', '=', 'users.id')
        ->select('resources.*', 'users.*')
        ->where('status_id', '=', 3);
    if (isset($languagesearch)) $query=$query->where('resources.languages->"$.name"', $languagesearch);
    if (isset($formatssearch)) $query=$query->whereRaw('JSON_EXTRACT(resources.formats, "$.name") = "'.$formatssearch.'"');

    $resources = $query->get();
    $resources = json_decode( json_encode($resources), true);

你我有两个 JSON 列,我已经使用两种不同的方法尝试了它们,但仍然没有成功。它确实正确地设置或取消设置了值,只是 where 子句不起作用。

编辑:JSON 列格式为:[{"name": "English"}, {"name": "German"}, {"name": "Portuguese"}]

我的MySQL版本是5.7.18

Laravel 查询生成器仅使用普通的 -> 运算符。它会在后端将其转换为正确的语法。您的 where 子句应如下所示:

if (isset($languagesearch)) {
    $query = $query->where('resources.languages->name', $languagesearch);
}
if (isset($formatssearch)) {
    $query = $query->where('resources.formats->name', $formatssearch);
}

您可以阅读有关 json where clauses in the documentation here 的更多信息。

当然,这假设您使用的是受支持的 MySQL 版本(至少 5.7.9)。

编辑

因为您要在 json 数组中搜索某个值,所以您需要使用 JSON_CONTAINS() 函数。你可能想看看 the documentation for json search functions here.

根据当前 json 的结构方式,您需要这样的东西:

if (isset($languagesearch)) {
    $query = $query->whereRaw('JSON_CONTAINS(resources.languages, \'{"name": "'.$languagesearch.'"}\')');
}