PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / orm / src / Internal / Hydration / AbstractHydrator.php
mailpoet / vendor-prefixed / doctrine / orm / src / Internal / Hydration Last commit date
AbstractHydrator.php 9 months ago ArrayHydrator.php 9 months ago HydrationException.php 9 months ago IterableResult.php 9 months ago ObjectHydrator.php 9 months ago ScalarColumnHydrator.php 9 months ago ScalarHydrator.php 9 months ago SimpleObjectHydrator.php 9 months ago SingleScalarHydrator.php 9 months ago index.php 9 months ago
AbstractHydrator.php
324 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Internal\Hydration;
4 if (!defined('ABSPATH')) exit;
5 use BackedEnum;
6 use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement;
7 use MailPoetVendor\Doctrine\DBAL\ForwardCompatibility\Result as ForwardCompatibilityResult;
8 use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform;
9 use MailPoetVendor\Doctrine\DBAL\Result;
10 use MailPoetVendor\Doctrine\DBAL\Types\Type;
11 use MailPoetVendor\Doctrine\Deprecations\Deprecation;
12 use MailPoetVendor\Doctrine\ORM\EntityManagerInterface;
13 use MailPoetVendor\Doctrine\ORM\Events;
14 use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata;
15 use MailPoetVendor\Doctrine\ORM\Query\ResultSetMapping;
16 use MailPoetVendor\Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker;
17 use MailPoetVendor\Doctrine\ORM\UnitOfWork;
18 use Generator;
19 use LogicException;
20 use ReflectionClass;
21 use TypeError;
22 use function array_map;
23 use function array_merge;
24 use function count;
25 use function current;
26 use function end;
27 use function get_debug_type;
28 use function in_array;
29 use function is_array;
30 use function is_object;
31 use function sprintf;
32 abstract class AbstractHydrator
33 {
34 protected $_rsm;
35 protected $_em;
36 protected $_platform;
37 protected $_uow;
38 protected $_metadataCache = [];
39 protected $_cache = [];
40 protected $_stmt;
41 protected $_hints = [];
42 public function __construct(EntityManagerInterface $em)
43 {
44 $this->_em = $em;
45 $this->_platform = $em->getConnection()->getDatabasePlatform();
46 $this->_uow = $em->getUnitOfWork();
47 }
48 public function iterate($stmt, $resultSetMapping, array $hints = [])
49 {
50 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8463', 'Method %s() is deprecated and will be removed in Doctrine ORM 3.0. Use toIterable() instead.', __METHOD__);
51 $this->_stmt = $stmt instanceof ResultStatement ? ForwardCompatibilityResult::ensure($stmt) : $stmt;
52 $this->_rsm = $resultSetMapping;
53 $this->_hints = $hints;
54 $evm = $this->_em->getEventManager();
55 $evm->addEventListener([Events::onClear], $this);
56 $this->prepare();
57 return new IterableResult($this);
58 }
59 public function toIterable($stmt, ResultSetMapping $resultSetMapping, array $hints = []) : iterable
60 {
61 if (!$stmt instanceof Result) {
62 if (!$stmt instanceof ResultStatement) {
63 throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt)));
64 }
65 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class);
66 $stmt = ForwardCompatibilityResult::ensure($stmt);
67 }
68 $this->_stmt = $stmt;
69 $this->_rsm = $resultSetMapping;
70 $this->_hints = $hints;
71 $evm = $this->_em->getEventManager();
72 $evm->addEventListener([Events::onClear], $this);
73 $this->prepare();
74 try {
75 while (\true) {
76 $row = $this->statement()->fetchAssociative();
77 if ($row === \false) {
78 break;
79 }
80 $result = [];
81 $this->hydrateRowData($row, $result);
82 $this->cleanupAfterRowIteration();
83 if (count($result) === 1) {
84 if (count($resultSetMapping->indexByMap) === 0) {
85 (yield end($result));
86 } else {
87 yield from $result;
88 }
89 } elseif (is_object(current($result))) {
90 (yield $result);
91 } else {
92 (yield array_merge(...$result));
93 }
94 }
95 } finally {
96 $this->cleanup();
97 }
98 }
99 protected final function statement() : Result
100 {
101 if ($this->_stmt === null) {
102 throw new LogicException('Uninitialized _stmt property');
103 }
104 return $this->_stmt;
105 }
106 protected final function resultSetMapping() : ResultSetMapping
107 {
108 if ($this->_rsm === null) {
109 throw new LogicException('Uninitialized _rsm property');
110 }
111 return $this->_rsm;
112 }
113 public function hydrateAll($stmt, $resultSetMapping, array $hints = [])
114 {
115 if (!$stmt instanceof Result) {
116 if (!$stmt instanceof ResultStatement) {
117 throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt)));
118 }
119 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class);
120 $stmt = ForwardCompatibilityResult::ensure($stmt);
121 }
122 $this->_stmt = $stmt;
123 $this->_rsm = $resultSetMapping;
124 $this->_hints = $hints;
125 $this->_em->getEventManager()->addEventListener([Events::onClear], $this);
126 $this->prepare();
127 try {
128 $result = $this->hydrateAllData();
129 } finally {
130 $this->cleanup();
131 }
132 return $result;
133 }
134 public function hydrateRow()
135 {
136 Deprecation::triggerIfCalledFromOutside('doctrine/orm', 'https://github.com/doctrine/orm/pull/9072', '%s is deprecated.', __METHOD__);
137 $row = $this->statement()->fetchAssociative();
138 if ($row === \false) {
139 $this->cleanup();
140 return \false;
141 }
142 $result = [];
143 $this->hydrateRowData($row, $result);
144 return $result;
145 }
146 public function onClear($eventArgs)
147 {
148 }
149 protected function prepare()
150 {
151 }
152 protected function cleanup()
153 {
154 $this->statement()->free();
155 $this->_stmt = null;
156 $this->_rsm = null;
157 $this->_cache = [];
158 $this->_metadataCache = [];
159 $this->_em->getEventManager()->removeEventListener([Events::onClear], $this);
160 }
161 protected function cleanupAfterRowIteration() : void
162 {
163 }
164 protected function hydrateRowData(array $row, array &$result)
165 {
166 throw new HydrationException('hydrateRowData() not implemented by this hydrator.');
167 }
168 protected abstract function hydrateAllData();
169 protected function gatherRowData(array $data, array &$id, array &$nonemptyComponents)
170 {
171 $rowData = ['data' => []];
172 foreach ($data as $key => $value) {
173 $cacheKeyInfo = $this->hydrateColumnInfo($key);
174 if ($cacheKeyInfo === null) {
175 continue;
176 }
177 $fieldName = $cacheKeyInfo['fieldName'];
178 switch (\true) {
179 case isset($cacheKeyInfo['isNewObjectParameter']):
180 $argIndex = $cacheKeyInfo['argIndex'];
181 $objIndex = $cacheKeyInfo['objIndex'];
182 $type = $cacheKeyInfo['type'];
183 $value = $type->convertToPHPValue($value, $this->_platform);
184 if ($value !== null && isset($cacheKeyInfo['enumType'])) {
185 $value = $this->buildEnum($value, $cacheKeyInfo['enumType']);
186 }
187 $rowData['newObjects'][$objIndex]['class'] = $cacheKeyInfo['class'];
188 $rowData['newObjects'][$objIndex]['args'][$argIndex] = $value;
189 break;
190 case isset($cacheKeyInfo['isScalar']):
191 $type = $cacheKeyInfo['type'];
192 $value = $type->convertToPHPValue($value, $this->_platform);
193 if ($value !== null && isset($cacheKeyInfo['enumType'])) {
194 $value = $this->buildEnum($value, $cacheKeyInfo['enumType']);
195 }
196 $rowData['scalars'][$fieldName] = $value;
197 break;
198 //case (isset($cacheKeyInfo['isMetaColumn'])):
199 default:
200 $dqlAlias = $cacheKeyInfo['dqlAlias'];
201 $type = $cacheKeyInfo['type'];
202 // If there are field name collisions in the child class, then we need
203 // to only hydrate if we are looking at the correct discriminator value
204 if (isset($cacheKeyInfo['discriminatorColumn'], $data[$cacheKeyInfo['discriminatorColumn']]) && !in_array((string) $data[$cacheKeyInfo['discriminatorColumn']], $cacheKeyInfo['discriminatorValues'], \true)) {
205 break;
206 }
207 // in an inheritance hierarchy the same field could be defined several times.
208 // We overwrite this value so long we don't have a non-null value, that value we keep.
209 // Per definition it cannot be that a field is defined several times and has several values.
210 if (isset($rowData['data'][$dqlAlias][$fieldName])) {
211 break;
212 }
213 $rowData['data'][$dqlAlias][$fieldName] = $type ? $type->convertToPHPValue($value, $this->_platform) : $value;
214 if ($rowData['data'][$dqlAlias][$fieldName] !== null && isset($cacheKeyInfo['enumType'])) {
215 $rowData['data'][$dqlAlias][$fieldName] = $this->buildEnum($rowData['data'][$dqlAlias][$fieldName], $cacheKeyInfo['enumType']);
216 }
217 if ($cacheKeyInfo['isIdentifier'] && $value !== null) {
218 $id[$dqlAlias] .= '|' . $value;
219 $nonemptyComponents[$dqlAlias] = \true;
220 }
221 break;
222 }
223 }
224 return $rowData;
225 }
226 protected function gatherScalarRowData(&$data)
227 {
228 $rowData = [];
229 foreach ($data as $key => $value) {
230 $cacheKeyInfo = $this->hydrateColumnInfo($key);
231 if ($cacheKeyInfo === null) {
232 continue;
233 }
234 $fieldName = $cacheKeyInfo['fieldName'];
235 // WARNING: BC break! We know this is the desired behavior to type convert values, but this
236 // erroneous behavior exists since 2.0 and we're forced to keep compatibility.
237 if (!isset($cacheKeyInfo['isScalar'])) {
238 $type = $cacheKeyInfo['type'];
239 $value = $type ? $type->convertToPHPValue($value, $this->_platform) : $value;
240 $fieldName = $cacheKeyInfo['dqlAlias'] . '_' . $fieldName;
241 }
242 $rowData[$fieldName] = $value;
243 }
244 return $rowData;
245 }
246 protected function hydrateColumnInfo($key)
247 {
248 if (isset($this->_cache[$key])) {
249 return $this->_cache[$key];
250 }
251 switch (\true) {
252 // NOTE: Most of the times it's a field mapping, so keep it first!!!
253 case isset($this->_rsm->fieldMappings[$key]):
254 $classMetadata = $this->getClassMetadata($this->_rsm->declaringClasses[$key]);
255 $fieldName = $this->_rsm->fieldMappings[$key];
256 $fieldMapping = $classMetadata->fieldMappings[$fieldName];
257 $ownerMap = $this->_rsm->columnOwnerMap[$key];
258 $columnInfo = ['isIdentifier' => in_array($fieldName, $classMetadata->identifier, \true), 'fieldName' => $fieldName, 'type' => Type::getType($fieldMapping['type']), 'dqlAlias' => $ownerMap, 'enumType' => $this->_rsm->enumMappings[$key] ?? null];
259 // the current discriminator value must be saved in order to disambiguate fields hydration,
260 // should there be field name collisions
261 if ($classMetadata->parentClasses && isset($this->_rsm->discriminatorColumns[$ownerMap])) {
262 return $this->_cache[$key] = array_merge($columnInfo, ['discriminatorColumn' => $this->_rsm->discriminatorColumns[$ownerMap], 'discriminatorValue' => $classMetadata->discriminatorValue, 'discriminatorValues' => $this->getDiscriminatorValues($classMetadata)]);
263 }
264 return $this->_cache[$key] = $columnInfo;
265 case isset($this->_rsm->newObjectMappings[$key]):
266 // WARNING: A NEW object is also a scalar, so it must be declared before!
267 $mapping = $this->_rsm->newObjectMappings[$key];
268 return $this->_cache[$key] = ['isScalar' => \true, 'isNewObjectParameter' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'argIndex' => $mapping['argIndex'], 'objIndex' => $mapping['objIndex'], 'class' => new ReflectionClass($mapping['className']), 'enumType' => $this->_rsm->enumMappings[$key] ?? null];
269 case isset($this->_rsm->scalarMappings[$key], $this->_hints[LimitSubqueryWalker::FORCE_DBAL_TYPE_CONVERSION]):
270 return $this->_cache[$key] = ['fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'dqlAlias' => '', 'enumType' => $this->_rsm->enumMappings[$key] ?? null];
271 case isset($this->_rsm->scalarMappings[$key]):
272 return $this->_cache[$key] = ['isScalar' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'enumType' => $this->_rsm->enumMappings[$key] ?? null];
273 case isset($this->_rsm->metaMappings[$key]):
274 // Meta column (has meaning in relational schema only, i.e. foreign keys or discriminator columns).
275 $fieldName = $this->_rsm->metaMappings[$key];
276 $dqlAlias = $this->_rsm->columnOwnerMap[$key];
277 $type = isset($this->_rsm->typeMappings[$key]) ? Type::getType($this->_rsm->typeMappings[$key]) : null;
278 // Cache metadata fetch
279 $this->getClassMetadata($this->_rsm->aliasMap[$dqlAlias]);
280 return $this->_cache[$key] = ['isIdentifier' => isset($this->_rsm->isIdentifierColumn[$dqlAlias][$key]), 'isMetaColumn' => \true, 'fieldName' => $fieldName, 'type' => $type, 'dqlAlias' => $dqlAlias, 'enumType' => $this->_rsm->enumMappings[$key] ?? null];
281 }
282 // this column is a left over, maybe from a LIMIT query hack for example in Oracle or DB2
283 // maybe from an additional column that has not been defined in a NativeQuery ResultSetMapping.
284 return null;
285 }
286 private function getDiscriminatorValues(ClassMetadata $classMetadata) : array
287 {
288 $values = array_map(function (string $subClass) : string {
289 return (string) $this->getClassMetadata($subClass)->discriminatorValue;
290 }, $classMetadata->subClasses);
291 $values[] = (string) $classMetadata->discriminatorValue;
292 return $values;
293 }
294 protected function getClassMetadata($className)
295 {
296 if (!isset($this->_metadataCache[$className])) {
297 $this->_metadataCache[$className] = $this->_em->getClassMetadata($className);
298 }
299 return $this->_metadataCache[$className];
300 }
301 protected function registerManaged(ClassMetadata $class, $entity, array $data)
302 {
303 if ($class->isIdentifierComposite) {
304 $id = [];
305 foreach ($class->identifier as $fieldName) {
306 $id[$fieldName] = isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName];
307 }
308 } else {
309 $fieldName = $class->identifier[0];
310 $id = [$fieldName => isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]];
311 }
312 $this->_em->getUnitOfWork()->registerManaged($entity, $id, $data);
313 }
314 protected final function buildEnum($value, string $enumType)
315 {
316 if (is_array($value)) {
317 return array_map(static function ($value) use($enumType) : BackedEnum {
318 return $enumType::from($value);
319 }, $value);
320 }
321 return $enumType::from($value);
322 }
323 }
324