在Doctrine 2中有一种方法可以让数组水合模式在输出中包含相关实体的类名,所以代替:
array(
'id' => 1,
'name' => 'test',
// ...
);
你得到:
array(
'__class' => 'MyProject\MyClass',
'id' => 1,
'name' => 'test',
// ...
);
我知道Doctrine\ORM\Internal\Hydration\ArrayHydrator
班级可以访问相关信息,但是如果可以在不重新实施整个ArrayHydrator
的情况下完成此操作,我会尝试解决这个问题吗?
答案 0 :(得分:1)
因此,创建一个扩展ArrayHydrator
并使用此方法覆盖gatherRowData
方法的自定义水合器是一种可能的解决方案:
protected function gatherRowData(array $data, array &$id, array &$nonemptyComponents)
{
$rowData = parent::gatherRowData($data, $id, $nonemptyComponents);
foreach ($rowData['data'] as $dqlAlias => $data) {
$class = $this->_rsm->aliasMap[$dqlAlias];
$meta = $this->getClassMetadata($class);
if ($meta->discriminatorMap) {
$class = $meta->discriminatorMap[$data[$meta->discriminatorColumn['name']]];
}
$rowData['data'][$dqlAlias]['__CLASS__'] = $class;
}
return $rowData;
}
有兴趣知道是否有更好的方式?