Skip to content

Commit ebb1bac

Browse files
Add support fetch=EAGER OneToOne and ManyToOne for inheritance
1 parent 36bef3f commit ebb1bac

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

src/Persisters/Entity/BasicEntityPersister.php

+21-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use LengthException;
4444

4545
use function array_combine;
46+
use function array_key_exists;
4647
use function array_keys;
4748
use function array_map;
4849
use function array_merge;
@@ -1266,11 +1267,19 @@ protected function getSelectColumnsSQL(): string
12661267

12671268
$eagerEntity = $this->em->getClassMetadata($assoc->targetEntity);
12681269

1270+
$conditionsForInheritance = [];
12691271
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;
12711277
}
12721278

12731279
$assocAlias = 'e' . ($eagerAliasCounter++);
1280+
1281+
$additionalConditions = [$assocAlias => $conditionsForInheritance];
1282+
12741283
$this->currentPersisterContext->rsm->addJoinedEntityResult($assoc->targetEntity, $assocAlias, 'r', $assocField);
12751284

12761285
foreach ($eagerEntity->fieldNames as $field) {
@@ -1327,12 +1336,22 @@ protected function getSelectColumnsSQL(): string
13271336
} else {
13281337
$this->currentPersisterContext->selectJoinSql .= ' LEFT JOIN';
13291338

1339+
$associationTableAlias = $this->getSQLTableAlias($association->sourceEntity, $assocAlias);
1340+
13301341
foreach ($association->joinColumns as $joinColumn) {
13311342
$sourceCol = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->class, $this->platform);
13321343
$targetCol = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $this->class, $this->platform);
13331344

1334-
$joinCondition[] = $this->getSQLTableAlias($association->sourceEntity, $assocAlias) . '.' . $sourceCol . ' = '
1345+
$conditionJoinItem = $associationTableAlias . '.' . $sourceCol . ' = '
13351346
. $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;
13361355
}
13371356

13381357
// Add filter SQL

0 commit comments

Comments
 (0)