我正在尝试使用Laravel在MYSQL中查询JSON列。当我知道应该有记录时,我无法获取记录。
这是我的select语句,如果我在从Laravel中提取后直接在MySQL中尝试:
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
答案 0 :(得分:1)
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.'"}\')');
}