我有Product
实体与多对一Category
实体。我需要Product
在会话中存储。首先,我尝试\Serializable
在 Product 上实现接口。我应该如何序列化我的相关Category
实体?我还应该实现\Serializable
接口吗?
我读到,学说中的序列化是非常痛苦的操作,我想到了这一点:
我们可以从实体中获取原始值吗?正是存储在数据库中的数据。如果我们能得到这个值,我们就可以将它存储在任何地方并重新创建对象!
我阅读了学说 2Doctrine\ORM\Internal\Hydration\ObjectHydrator:hydrateRowData
的代码并找到了方法,但它受到了保护。是否有任何公共 api 可以做到这一点?
更新:
我只是从 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
我们有原始值。现在我们需要方法如何通过这个数组创建对象