无法让 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.'"}\')');
}
我正在尝试使用 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.'"}\')');
}