我有Product
实体与许多-to-one的Category
实体。 我需要存储Product
的会话。 首先,我试图实现\Serializable
的产品界面。 我应该如何序列化我相关Category
的实体? 是否也应该实现\Serializable
界面?
我阅读,系列化的教义是非常痛苦的操作,我想这个问题:
我们可以从实体获取原始值? 正是这样的数据,其存储在数据库中。 如果我们能得到这个值,我们可以在任何地方保存并重新创建对象!
我读doctrine2代码,并找到方法Doctrine\ORM\Internal\Hydration\ObjectHydrator:hydrateRowData
但它的保护。 是否有这样做的任何公开的API?
更新:
我只是copypaste和整合来自BasicEntityPersister一些代码,它似乎工作。
$product = $productsRepository->find($id);
if (!$product) {
throw $this->createNotFoundException('No product found for id ' . $id);
}
$uow = $em->getUnitOfWork();
$entityPersister = $uow->getEntityPersister(get_class($product));
$classMetadata = $entityPersister->getClassMetadata();
$originalData = $uow->getOriginalEntityData($product);
$result = array();
foreach ($originalData as $field => $value) {
if (isset($classMetadata->associationMappings[$field])) {
$assoc = $classMetadata->associationMappings[$field];
// Only owning side of x-1 associations can have a FK column.
if ( ! $assoc['isOwningSide'] || ! ($assoc['type'] & \Doctrine\ORM\Mapping\ClassMetadata::TO_ONE)) {
continue;
}
if ($value !== null) {
$newValId = $uow->getEntityIdentifier($value);
}
$targetClass = $em->getClassMetadata($assoc['targetEntity']);
$owningTable = $entityPersister->getOwningTable($field);
foreach ($assoc['joinColumns'] as $joinColumn) {
$sourceColumn = $joinColumn['name'];
$targetColumn = $joinColumn['referencedColumnName'];
if ($value === null) {
$result[$owningTable][$sourceColumn] = null;
} else if ($targetClass->containsForeignIdentifier) {
$result[$owningTable][$sourceColumn] = $newValId[$targetClass->getFieldForColumn($targetColumn)];
} else {
$result[$owningTable][$sourceColumn] = $newValId[$targetClass->fieldNames[$targetColumn]];
}
}
} elseif (isset($classMetadata->columnNames[$field])) {
$columnName = $classMetadata->columnNames[$field];
$result[$entityPersister->getOwningTable($field)][$columnName] = $value;
}
}
print_r($result);
在$result
,我们有原始值。 现在,我们需要的方式如何通过这个数组来创建对象