Доктрина - "гнезда" поля JSON - PullRequest
1 голос
/ 01 октября 2019

У меня есть поле модели («данные»), которое отображается в поле json MYSQL следующим образом:

class Person {

    /** @Id @Column(type="integer", name="person_id") @GeneratedValue **/
    protected $id;

    /** @Column(type="json") **/
    protected $data;

    /** @Column(type="string") **/
    protected $name;

}

Я могу запрашивать и сериализовать Person, но поля данных вложены:

$person = $personRepository->find(11);
echo $serializer->serialize($person, 'json');
//returns {"id": 11, "name": "Daniel", "data": {"age": 57, "city": "Omaha"} }

Я хотел бы отменить вложение поля data, чтобы оно сериализовало inline.

//returns {"id": 11, "name": "Daniel", "age": 57, "city": "Omaha"}

Возможно ли это?

1 Ответ

0 голосов
/ 02 октября 2019

Здесь я вижу разные решения, от ужасно грязных до "ну, ничего страшного"

все решения, которые не очень грязные (например, замена строк скобками и прочее), все работают с нормализованным массивом:

$array = $serializer->normalize($person);
/** add code, that turns $array into flattened version $flattened */
$json = $serializer->encode($flattened, 'json');

Теперь, что это за код, который выравнивает массив ... например, вот так:

// if this is done in a loop, this, $flattened should be reinitialized every iteration!!!
$flattened = []; 
array_walk_recursive($array, function($value, $key) use (&$flattened) {
    $target[$key] = $value;
});
// $flattened contains the flattened array

немного более длинная версия:

// define somewhere outside of loop
function flatten($array, $flattened = []) {
    foreach($array as $key => $value) {
        if(is_array($value)) {
            $flattened = flatten($value, $flattened);
        } else {
            $flattened[$key] = $value;
        }
    }
    return $flattened;
}

// call flatten
$flattened = flatten($array);

очень интересным решением было бы интегрировать все это в ваш пользовательский кодер, который расширяет кодер json, но я думаю, это уже излишне.

также обратите внимание, что это может и не получится во многих случаях,поскольку ключи могут быть переопределены, его нельзя применять к массивам объектов без итерации по ним, это может привести к нежелательным результатам для вложенных объектов и т. д.

...