88use InvalidArgumentException ;
99use Nette \Utils \Strings ;
1010use Utilitte \Doctrine \Query \ValueObject \Alias ;
11+ use Utilitte \Doctrine \Query \ValueObject \Config ;
1112use Utilitte \Doctrine \QueryMetadataExtractor ;
1213
1314final class RawQueryStatement
@@ -24,6 +25,8 @@ final class RawQueryStatement
2425 /** @var Alias[] */
2526 private array $ aliases = [];
2627
28+ private Config $ config ;
29+
2730 public function __construct (QueryMetadataExtractor $ queryMetadataExtractor , string $ sql )
2831 {
2932 $ this ->queryMetadataExtractor = $ queryMetadataExtractor ;
@@ -33,12 +36,13 @@ public function __construct(QueryMetadataExtractor $queryMetadataExtractor, stri
3336 $ queryMetadataExtractor ->getEntityManager (),
3437 ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT
3538 );
36- $ this ->functions = new BuiltInFunctions ($ queryMetadataExtractor , $ this ->rsmBuilder );
39+ $ this ->config = new Config ();
40+ $ this ->functions = new BuiltInFunctions ($ queryMetadataExtractor , $ this ->rsmBuilder , $ this ->config );
3741 }
3842
39- public function addScalarResult (string $ column , string $ alias , string $ type = 'string ' ): self
43+ public function addScalarResult (string $ column , ? string $ alias = null , string $ type = 'string ' ): self
4044 {
41- $ this ->rsmBuilder ->addScalarResult ($ column , $ alias , $ type );
45+ $ this ->rsmBuilder ->addScalarResult ($ column , $ alias ?? $ column , $ type );
4246
4347 return $ this ;
4448 }
@@ -52,6 +56,28 @@ public function addRootEntity(string $class, string $alias): self
5256 return $ this ;
5357 }
5458
59+ public function addJoin (string $ sourceAlias , string $ field , string $ alias ): self
60+ {
61+ $ class = $ this ->aliases [$ sourceAlias ]->getClass ();
62+ $ metadata = $ this ->queryMetadataExtractor ->getClassMetadata ($ class );
63+ $ assocClass = $ metadata ->getAssociationTargetClass ($ field );
64+ $ assocMetadata = $ this ->queryMetadataExtractor ->getClassMetadata ($ assocClass );
65+
66+ $ this ->config ->addJoin ($ alias , sprintf (
67+ '%s AS %s ON %s.%s = %s.%s ' ,
68+ $ assocMetadata ->getTableName (),
69+ $ alias ,
70+ $ sourceAlias ,
71+ $ metadata ->getSingleAssociationJoinColumnName ($ field ),
72+ $ alias ,
73+ $ metadata ->getSingleAssociationReferencedJoinColumnName ($ field )
74+ ));
75+
76+ $ this ->addEntity ($ assocClass , $ alias );
77+
78+ return $ this ;
79+ }
80+
5581 public function addEntity (string $ class , string $ alias ): self
5682 {
5783 $ this ->aliases [$ alias ] = new Alias ($ class , $ alias );
0 commit comments