Skip to content

Commit 301e3a0

Browse files
authored
Merge pull request #68
2 parents 3e1f8d8 + b4c17af commit 301e3a0

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/Bridge/Repository/AbstractEntityRepository.php

+37-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ abstract class AbstractEntityRepository implements EntityRepositoryInterface
5757

5858
private array $tableAliases = [];
5959
private array $additionalFieldsToSelect = [];
60+
private array $joins = [];
6061

6162
public function __construct(
6263
private string $entityClassName,
@@ -138,6 +139,8 @@ public function updateSingleField(int $id, string $field, mixed $newValue): bool
138139

139140
public function createFindByQueryBuilder(array $criteria, ?array $orderBy): QueryBuilder
140141
{
142+
$this->resetProperties();
143+
141144
$normalizedCriteria = $this->normalizeCriteria($criteria);
142145
$this->tableAliases['p'] = $this->getEntityBaseFields();
143146

@@ -531,6 +534,10 @@ private function createNestedCriteria(QueryBuilder $queryBuilder, NestedConditio
531534
private function joinSelfMetaTable(QueryBuilder $queryBuilder, bool $incrementIfNecessary = false): string
532535
{
533536
$applyJoin = function (QueryBuilder $queryBuilder, string $alias): void {
537+
if (in_array($alias, $this->joins, true)) {
538+
return;
539+
}
540+
534541
if (!array_key_exists($alias, $this->tableAliases)) {
535542
$this->tableAliases[$alias] = [];
536543
}
@@ -541,6 +548,8 @@ private function joinSelfMetaTable(QueryBuilder $queryBuilder, bool $incrementIf
541548
$alias,
542549
sprintf('p.%s = %s.%s', static::TABLE_IDENTIFIER, $alias, static::TABLE_META_IDENTIFIER),
543550
);
551+
552+
$this->registerJoin($alias);
544553
};
545554

546555
static $aliasNumber = 1;
@@ -569,7 +578,7 @@ private function hasJoin(QueryBuilder $queryBuilder, string $joinAlias): bool
569578
return count(array_filter($matches, static fn (array $match) => $match[2] === $joinAlias)) > 0;
570579
}
571580
} catch (QueryException) {
572-
return false;
581+
return array_key_exists($joinAlias, $this->joins);
573582
}
574583

575584
return false;
@@ -622,6 +631,8 @@ private function createRelationshipCriteria(
622631
->setParameter(sprintf('%s_field', $alias), $condition->getRelationshipFieldName())
623632
;
624633

634+
$this->registerJoin($alias);
635+
625636
if (!empty($condition->getAlias())) {
626637
$trimmedAlias = trim($condition->getAlias(), '_');
627638

@@ -685,6 +696,8 @@ private function createTermRelationshipCriteria(
685696
)
686697
;
687698

699+
$this->registerJoin(["tr_{$aliasNumber}", "tt_{$aliasNumber}", $termTableAlias]);
700+
688701
$prefixedCriteria = $this->getPrefixedCriteriaForTermRelationshipCondition(
689702
$condition->getCriteria(),
690703
$termTableAlias,
@@ -732,6 +745,8 @@ private function createPostRelationshipCriteria(
732745
)
733746
;
734747

748+
$this->registerJoin(["tr_{$aliasNumber}", "p_{$aliasNumber}"]);
749+
735750
$this->additionalFieldsToSelect[] = 'tt.term_taxonomy_id';
736751
$this->addPostMetaJoinForPostRelationshipCondition($queryBuilder, $condition, $aliasNumber);
737752
$prefixedCriteria = $this->getPrefixedCriteriaForPostRelationshipCondition($condition, $aliasNumber);
@@ -769,6 +784,8 @@ private function addPostMetaJoinForPostRelationshipCondition(
769784
sprintf('p_%d.id = pm_%d.%s', $aliasNumber, $aliasNumber, self::TABLE_META_IDENTIFIER),
770785
);
771786

787+
$this->registerJoin($alias);
788+
772789
foreach ($extraFields as $extraField) {
773790
$this->tableAliases[$alias][] = property_to_field($extraField);
774791
}
@@ -825,6 +842,7 @@ private function selectColumns(QueryBuilder $queryBuilder, array $extraFields, S
825842
if (in_array($column, $extraFields, true)) {
826843
$mappedMetaKey = $this->getMappedMetaKey($column);
827844
$selects[] = select_from_eav($column, $mappedMetaKey);
845+
$this->joinSelfMetaTable($queryBuilder);
828846
} elseif (str_starts_with($column, 'MAX(')) {
829847
$selects[] = $column;
830848
$this->joinSelfMetaTable($queryBuilder);
@@ -843,4 +861,22 @@ private function selectColumns(QueryBuilder $queryBuilder, array $extraFields, S
843861
$queryBuilder->select(...$selects, ...$this->additionalFieldsToSelect);
844862
$this->additionalFieldsToSelect = [];
845863
}
864+
865+
private function registerJoin(string|array $alias): void
866+
{
867+
if (is_array($alias)) {
868+
$this->joins = array_merge($this->joins, $alias);
869+
} else {
870+
$this->joins[] = $alias;
871+
}
872+
873+
$this->joins = array_unique($this->joins);
874+
}
875+
876+
private function resetProperties(): void
877+
{
878+
$this->tableAliases = [];
879+
$this->additionalFieldsToSelect = [];
880+
$this->joins = [];
881+
}
846882
}

test/Test/Bridge/Repository/ProductRepositoryTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -552,4 +552,14 @@ public function testOperatorIsNotNullNested(): void
552552
self::assertContainsOnlyInstancesOf(Product::class, $products);
553553
self::assertEquals([17, 20, 23], array_column($products, 'id'));
554554
}
555+
556+
public function testSelectEntityFieldWithoutQueryingIt(): void
557+
{
558+
$product = $this->repository->findOneBy([
559+
new SelectColumns(['id', 'sku']),
560+
'post_title' => 'Hoodie',
561+
]);
562+
563+
$this->assertSame('woo-hoodie', $product->sku);
564+
}
555565
}

0 commit comments

Comments
 (0)