1 | <?php |
||
40 | final class SimpleSelectDataLoader implements DataLoaderInterface |
||
41 | { |
||
42 | |||
43 | /** |
||
44 | * @var MappingDriverInterface |
||
45 | */ |
||
46 | private $mappingDriver; |
||
47 | |||
48 | /** |
||
49 | * @var array<array<scalar>> |
||
50 | */ |
||
51 | private $originalData = array(); |
||
52 | |||
53 | /** |
||
54 | * @var int |
||
55 | */ |
||
56 | private $originalDataLimit; |
||
57 | |||
58 | 10 | public function __construct( |
|
65 | |||
66 | /** |
||
67 | * @param object $entity |
||
68 | */ |
||
69 | 6 | public function loadDBALDataForEntity($entity, EntityManagerInterface $entityManager): array |
|
70 | { |
||
71 | /** @var string $className */ |
||
72 | 6 | $className = get_class($entity); |
|
73 | |||
74 | /** @var string $entityObjectHash */ |
||
75 | 6 | $entityObjectHash = spl_object_hash($entity); |
|
76 | |||
77 | 6 | $this->originalData[$entityObjectHash] = []; |
|
78 | |||
79 | /** @var array<string> $additionalData */ |
||
80 | 6 | $additionalData = array(); |
|
|
|||
81 | |||
82 | do { |
||
83 | 6 | if (class_exists(ClassUtils::class)) { |
|
84 | 6 | $className = ClassUtils::getRealClass($className); |
|
85 | } |
||
86 | |||
87 | 6 | if (!$entityManager->getMetadataFactory()->isTransient($className)) { |
|
88 | /** @var ClassMetadata $classMetaData */ |
||
89 | 6 | $classMetaData = $entityManager->getClassMetadata($className); |
|
90 | |||
91 | /** @var ?EntityMappingInterface $entityMapping */ |
||
92 | 6 | $entityMapping = $this->mappingDriver->loadRDMMetadataForClass($className); |
|
93 | |||
94 | 6 | if ($entityMapping instanceof EntityMappingInterface) { |
|
95 | /** @var array<Column> $additionalColumns */ |
||
96 | 6 | $additionalColumns = $entityMapping->collectDBALColumns(); |
|
97 | |||
98 | 6 | if (!empty($additionalColumns)) { |
|
99 | /** @var Connection $connection */ |
||
100 | 3 | $connection = $entityManager->getConnection(); |
|
101 | |||
102 | /** @var QueryBuilder $queryBuilder */ |
||
103 | 3 | $queryBuilder = $connection->createQueryBuilder(); |
|
104 | |||
105 | /** @var Expr $expr */ |
||
106 | 3 | $expr = $queryBuilder->expr(); |
|
107 | |||
108 | 3 | foreach ($additionalColumns as $column) { |
|
109 | /** @var Column $column */ |
||
110 | |||
111 | 3 | $queryBuilder->addSelect($column->getName()); |
|
112 | } |
||
113 | |||
114 | 3 | $reflectionClass = new ReflectionClass($className); |
|
115 | |||
116 | /** @var bool $hasId */ |
||
117 | 3 | $hasId = false; |
|
118 | |||
119 | 3 | foreach ($classMetaData->identifier as $idFieldName) { |
|
120 | /** @var string $idFieldName */ |
||
121 | |||
122 | /** @var array $idColumn */ |
||
123 | 3 | $idColumn = $classMetaData->fieldMappings[$idFieldName]; |
|
124 | |||
125 | /** @var ReflectionProperty $reflectionProperty */ |
||
126 | 3 | $reflectionProperty = $reflectionClass->getProperty($idFieldName); |
|
127 | |||
128 | 3 | $reflectionProperty->setAccessible(true); |
|
129 | |||
130 | 3 | $idValue = $reflectionProperty->getValue($entity); |
|
131 | |||
132 | 3 | if (!empty($idValue)) { |
|
133 | 3 | $hasId = true; |
|
134 | 3 | if (!is_numeric($idValue) || empty($idValue)) { |
|
135 | 2 | $idValue = "'{$idValue}'"; |
|
136 | } |
||
137 | 3 | $queryBuilder->andWhere($expr->eq($idColumn['columnName'], $idValue)); |
|
138 | } |
||
139 | } |
||
140 | |||
141 | 3 | if ($hasId) { |
|
142 | 3 | $queryBuilder->from($classMetaData->getTableName()); |
|
143 | 3 | $queryBuilder->setMaxResults(1); |
|
144 | |||
145 | /** @var Statement $statement */ |
||
146 | 3 | $statement = $queryBuilder->execute(); |
|
147 | |||
148 | 3 | $additionalData = $statement->fetch(PDO::FETCH_ASSOC); |
|
149 | |||
150 | 3 | if (!is_array($additionalData)) { |
|
151 | $additionalData = array(); |
||
152 | } |
||
153 | |||
154 | 3 | $this->originalData[$entityObjectHash] = array_merge( |
|
155 | 3 | $this->originalData[$entityObjectHash], |
|
156 | 3 | $additionalData |
|
157 | ); |
||
158 | |||
159 | 3 | if (count($this->originalData) > $this->originalDataLimit) { |
|
160 | array_shift($this->originalData); |
||
161 | } |
||
162 | } |
||
163 | } |
||
164 | } |
||
165 | } |
||
166 | |||
167 | 6 | $className = current(class_parents($className)); |
|
168 | 6 | } while (class_exists($className)); |
|
169 | |||
170 | 6 | return $this->originalData[$entityObjectHash] ?? []; |
|
171 | } |
||
172 | |||
173 | /** |
||
174 | * @param object $entity |
||
175 | */ |
||
176 | 4 | public function storeDBALDataForEntity($entity, EntityManagerInterface $entityManager): void |
|
213 | |||
214 | /** |
||
215 | * @param object $entity |
||
216 | */ |
||
217 | 1 | public function removeDBALDataForEntity($entity, EntityManagerInterface $entityManager): void |
|
222 | |||
223 | 5 | public function prepareOnMetadataLoad(EntityManagerInterface $entityManager, ClassMetadata $classMetadata): void |
|
227 | |||
228 | /** |
||
229 | * @param object $entity |
||
230 | */ |
||
231 | 4 | private function hasDataChanged($entity, array $additionalData): bool |
|
255 | |||
256 | /** |
||
257 | * @param object $entity |
||
258 | */ |
||
259 | 4 | private function collectAdditionalDataForEntity( |
|
309 | |||
310 | /** |
||
311 | * @param object $entity |
||
312 | */ |
||
313 | 3 | private function collectIdentifierForEntity( |
|
341 | |||
342 | } |
||
343 |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVar
assignment in line 1 and the$higher
assignment in line 2 are dead. The first because$myVar
is never used and the second because$higher
is always overwritten for every possible time line.