|
43 | 43 | use LengthException;
|
44 | 44 |
|
45 | 45 | use function array_combine;
|
| 46 | +use function array_key_exists; |
46 | 47 | use function array_keys;
|
47 | 48 | use function array_map;
|
48 | 49 | use function array_merge;
|
@@ -1266,11 +1267,19 @@ protected function getSelectColumnsSQL(): string
|
1266 | 1267 |
|
1267 | 1268 | $eagerEntity = $this->em->getClassMetadata($assoc->targetEntity);
|
1268 | 1269 |
|
| 1270 | + $conditionsForInheritance = []; |
1269 | 1271 | if ($eagerEntity->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) {
|
1270 |
| - continue; // now this is why you shouldn't use inheritance |
| 1272 | + if ($eagerEntity->rootEntityName === $eagerEntity->name || $assoc['isOwningSide']) { |
| 1273 | + continue; // support only not owning side relation with inheritance |
| 1274 | + } |
| 1275 | + |
| 1276 | + $conditionsForInheritance[$eagerEntity->discriminatorColumn['fieldName']] = $eagerEntity->discriminatorValue; |
1271 | 1277 | }
|
1272 | 1278 |
|
1273 | 1279 | $assocAlias = 'e' . ($eagerAliasCounter++);
|
| 1280 | + |
| 1281 | + $additionalConditions = [$assocAlias => $conditionsForInheritance]; |
| 1282 | + |
1274 | 1283 | $this->currentPersisterContext->rsm->addJoinedEntityResult($assoc->targetEntity, $assocAlias, 'r', $assocField);
|
1275 | 1284 |
|
1276 | 1285 | foreach ($eagerEntity->fieldNames as $field) {
|
@@ -1327,12 +1336,22 @@ protected function getSelectColumnsSQL(): string
|
1327 | 1336 | } else {
|
1328 | 1337 | $this->currentPersisterContext->selectJoinSql .= ' LEFT JOIN';
|
1329 | 1338 |
|
| 1339 | + $associationTableAlias = $this->getSQLTableAlias($association->sourceEntity, $assocAlias); |
| 1340 | + |
1330 | 1341 | foreach ($association->joinColumns as $joinColumn) {
|
1331 | 1342 | $sourceCol = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->class, $this->platform);
|
1332 | 1343 | $targetCol = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $this->class, $this->platform);
|
1333 | 1344 |
|
1334 |
| - $joinCondition[] = $this->getSQLTableAlias($association->sourceEntity, $assocAlias) . '.' . $sourceCol . ' = ' |
| 1345 | + $conditionJoinItem = $associationTableAlias . '.' . $sourceCol . ' = ' |
1335 | 1346 | . $this->getSQLTableAlias($association->targetEntity) . '.' . $targetCol;
|
| 1347 | + |
| 1348 | + if (array_key_exists($assocAlias, $additionalConditions)) { |
| 1349 | + foreach ($additionalConditions[$assocAlias] as $key => $value) { |
| 1350 | + $conditionJoinItem .= sprintf(' AND %s.%s = %s', $associationTableAlias, $key, $this->conn->quote($value)); |
| 1351 | + } |
| 1352 | + } |
| 1353 | + |
| 1354 | + $joinCondition[] = $conditionJoinItem; |
1336 | 1355 | }
|
1337 | 1356 |
|
1338 | 1357 | // Add filter SQL
|
|
0 commit comments