Json_decode по результату mysql json_object не работает

Я пытаюсь выполнить запрос к таблице, где я хочу выбрать некоторые столбцы и некоторые другие столбцы в качестве вложенного объекта 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?

SELECT JSON_OBJECT(...) as `address` FROM ... вызывает преобразование полей внутри вызова JSON_OBJECT в строку JSON и возврат в виде столбца address. Ваше имя и т. д. Не являются частью звонка JSON_OBJECT и, следовательно, там не будет.
ccKep 02.04.2018 21:22
поле адреса - это обычная строка Это JSON, как вы думаете, что такое JSON?
AbraCadaver 02.04.2018 21:23

Драйвер MySQL не знает, что такое JSON, поэтому вам остается его расшифровывать вот так. Если вы используете ORM, он может сделать это за вас прозрачно, но в противном случае вы не можете ожидать, что это произойдет только по волшебству.

tadman 02.04.2018 21:24

Я раньше не использовал 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)

JNevill 02.04.2018 21:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
905
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы создаете объект 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);

Другие вопросы по теме