Doctrine2 экспортирует сущность в массив
я имеюProduct
сущность со многими к одномуCategory
юридическое лицо. Мне нужен магазинProduct
в сессии. Прежде всего я пытаюсь реализовать\Serializable
интерфейс на продукт. Как я должен сериализовать мои связанныеCategory
юридическое лицо? Должен ли я также реализовать\Serializable
интерфейс?
Я читал, что сериализация в доктрине очень болезненная операция, и я думаю об этом:
Можем ли мы получить необработанные значения от сущности? Именно те данные, которые хранятся в базе данных. Если мы можем получить эти значения, мы можем сохранить их где угодно и воссоздать объект!
Я читаю код doctrine2 и нахожу методDoctrine\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
у нас есть сырые ценности. Теперь нам нужен способ создания объекта по этому массиву.