@@ -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}
0 commit comments