我有一个模型字段("data"),它映射到一个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"}这个是可能的吗?
发布于 2019-10-02 15:28:22
我在这里看到了不同的解决方案,从非常脏到“嗯,没关系”。
所有不是很脏的解决方案(比如字符串替换大括号之类的东西),都在规范化的数组上工作:
$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编码器,但我想这已经太过分了。
还请注意,这在很多情况下都会中断,因为键可以被重写,它不能应用于对象数组而不迭代它们,它可能会对嵌套对象产生不想要的结果,等等。
https://stackoverflow.com/questions/58191760
复制相似问题