Doctrine-“嵌套” json字段

问题描述 投票:1回答:1

我有一个模型字段(“数据”),它如下映射到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字段,以便内联序列化。

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

这可能吗?

php json symfony orm doctrine
1个回答
0
投票

我在这里看到了不同的解决方案,从非常肮脏到“好吧,没关系”

所有不是很脏的解决方案(例如用字符串替换大括号和东西),都可以在标准化数组上工作:

$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编码器,但我想这已经太过头了。

还请注意,这在很多情况下都可能并且会中断,因为键可以被覆盖,如果不对其进行迭代,则不能将其应用于对象数组,它可能会为嵌套对象等产生不必要的结果,等等。

© www.soinside.com 2019 - 2024. All rights reserved.