Я пытаюсь выполнить запрос к таблице, где я хочу выбрать некоторые столбцы и некоторые другие столбцы в качестве вложенного объекта json, например, я хочу выбрать список пользователей с его адресом в качестве вложенного объекта.
SELECT
u.first_name, u.last_name, u.age, u.phone,
JSON_OBJECT(
'zip', a.zip,
'address', a.address,
'number', a.number,
'city', a.city,
'state', a.state
) as 'address'
FROM
tb_user u,
tb_user_address a
WHERE u.id_address = a.id
Ожидаемый результат будет примерно таким:
[
{
first_name: 'my name',
last_name: 'my last name',
... // Some other fields
address: {
zip: '987',
address: 'street name',
... // Some other fields
}
},
{
// Another user
}
]
Но когда он возвращается, поле address представляет собой обычную строку, например: address: "{'zip': '987', 'address': 'street name', 'city': 'cityname', 'state'...};", и только это поле (то, которое использует JSON_OBJECT) возвращается таким образом, остальные в порядке.
Когда я возвращаю результат запроса sql, я делаю так:
$user_list = json_decode(json_encode($query_result), true);
Но это тоже не решает проблемы. Есть ли способ превратить эту строку в действительный объект json?
Драйвер MySQL не знает, что такое JSON, поэтому вам остается его расшифровывать вот так. Если вы используете ORM, он может сделать это за вас прозрачно, но в противном случае вы не можете ожидать, что это произойдет только по волшебству.
Я раньше не использовал JSON_OBJECT, но вы можете просто обернуть все это в json_object, чтобы вы могли json_decode всю возвращаемую строку: SELECT JSON_OBJECT(first_name, last_name, age, phone, JSON_OBJECT(<address fields)) FROM your table... Затем json_decode($query_result)






Вы создаете объект JSON адреса в MySQL, поэтому он возвращается в виде строки, содержащей данные в формате JSON среди других столбцов.
Вы можете сделать следующее, чтобы преобразовать его в массив PHP перед JSON-кодированием всего результата:
$user_list = array_map(
function ($v) { return json_decode($v['address'], true); },
$query_result
);
$user_list = json_encode($user_list);
SELECT JSON_OBJECT(...) as `address` FROM ...вызывает преобразование полей внутри вызоваJSON_OBJECTв строку JSON и возврат в виде столбцаaddress. Ваше имя и т. д. Не являются частью звонкаJSON_OBJECTи, следовательно, там не будет.