@@ -1352,6 +1352,9 @@ public function walkSelectExpression(AST\SelectExpression $selectExpression): st
1352
1352
$ sql .= $ this ->walkNewObject ($ expr , $ selectExpression ->fieldIdentificationVariable );
1353
1353
break ;
1354
1354
1355
+ case $ expr instanceof AST \AllFieldsExpression:
1356
+ throw new LogicException ('All fields Expression are only supported in DTO. ' );
1357
+
1355
1358
default :
1356
1359
// IdentificationVariable or PartialObjectExpression
1357
1360
if ($ expr instanceof AST \PartialObjectExpression) {
@@ -1518,11 +1521,17 @@ public function walkNewObject(AST\NewObjectExpression $newObjectExpression, stri
1518
1521
{
1519
1522
$ sqlSelectExpressions = [];
1520
1523
$ objIndex = $ newObjectResultAlias ?: $ this ->newObjectCounter ++;
1524
+ $ aliasGap = $ newObjectExpression ->hasNamedArgs ? null : 0 ;
1521
1525
1522
1526
foreach ($ newObjectExpression ->args as $ argIndex => $ e ) {
1523
- $ resultAlias = $ this ->scalarResultCounter ++;
1524
- $ columnAlias = $ this ->getSQLColumnAlias ('sclr ' );
1525
- $ fieldType = 'string ' ;
1527
+ if (! $ newObjectExpression ->hasNamedArgs ) {
1528
+ $ argIndex += $ aliasGap ;
1529
+ }
1530
+
1531
+ $ resultAlias = $ this ->scalarResultCounter ++;
1532
+ $ columnAlias = $ this ->getSQLColumnAlias ('sclr ' );
1533
+ $ fieldType = 'string ' ;
1534
+ $ isScalarResult = true ;
1526
1535
1527
1536
switch (true ) {
1528
1537
case $ e instanceof AST \NewObjectExpression:
@@ -1576,18 +1585,30 @@ public function walkNewObject(AST\NewObjectExpression $newObjectExpression, stri
1576
1585
$ sqlSelectExpressions [] = trim ($ e ->dispatch ($ this ));
1577
1586
break ;
1578
1587
1588
+ case $ e instanceof AST \AllFieldsExpression:
1589
+ if (! $ newObjectExpression ->hasNamedArgs ) {
1590
+ throw new LogicException ('All fields Expression must be used with named arguments DTO constructor. ' );
1591
+ }
1592
+
1593
+ $ isScalarResult = false ;
1594
+ $ sqlSelectExpressions [] = $ e ->dispatch ($ this , $ objIndex , $ argIndex , $ aliasGap );
1595
+ break ;
1596
+
1579
1597
default :
1580
1598
$ sqlSelectExpressions [] = trim ($ e ->dispatch ($ this )) . ' AS ' . $ columnAlias ;
1581
1599
break ;
1582
1600
}
1583
1601
1584
- $ this ->scalarResultAliasMap [$ resultAlias ] = $ columnAlias ;
1585
- $ this ->rsm ->addScalarResult ($ columnAlias , $ resultAlias , $ fieldType );
1602
+ if ($ isScalarResult ) {
1603
+ $ this ->scalarResultAliasMap [$ resultAlias ] = $ columnAlias ;
1604
+ $ this ->rsm ->addScalarResult ($ columnAlias , $ resultAlias , $ fieldType );
1586
1605
1587
- $ this ->rsm ->newObjectMappings [$ columnAlias ] = [
1588
- 'objIndex ' => $ objIndex ,
1589
- 'argIndex ' => $ argIndex ,
1590
- ];
1606
+ $ this ->rsm ->newObjectMappings [$ columnAlias ] = [
1607
+ 'className ' => $ newObjectExpression ->className ,
1608
+ 'objIndex ' => $ objIndex ,
1609
+ 'argIndex ' => $ argIndex ,
1610
+ ];
1611
+ }
1591
1612
}
1592
1613
1593
1614
$ this ->rsm ->newObject [$ objIndex ] = $ newObjectExpression ->className ;
@@ -2292,6 +2313,46 @@ public function walkResultVariable(string $resultVariable): string
2292
2313
return $ resultAlias ;
2293
2314
}
2294
2315
2316
+ public function walkAllEntityFieldsExpression (AST \AllFieldsExpression $ expression , int |string $ objIndex , int |string $ argIndex , int |null &$ aliasGap ): string
2317
+ {
2318
+ $ dqlAlias = $ expression ->identificationVariable ;
2319
+ $ class = $ this ->getMetadataForDqlAlias ($ expression ->identificationVariable );
2320
+
2321
+ $ sqlParts = [];
2322
+ // Select all fields from the queried class
2323
+ foreach ($ class ->fieldMappings as $ fieldName => $ mapping ) {
2324
+ $ tableName = isset ($ mapping ->inherited )
2325
+ ? $ this ->em ->getClassMetadata ($ mapping ->inherited )->getTableName ()
2326
+ : $ class ->getTableName ();
2327
+
2328
+ $ sqlTableAlias = $ this ->getSQLTableAlias ($ tableName , $ dqlAlias );
2329
+ $ columnAlias = $ this ->getSQLColumnAlias ($ mapping ->columnName );
2330
+ $ quotedColumnName = $ this ->quoteStrategy ->getColumnName ($ fieldName , $ class , $ this ->platform );
2331
+
2332
+ $ col = $ sqlTableAlias . '. ' . $ quotedColumnName ;
2333
+
2334
+ $ type = Type::getType ($ mapping ->type );
2335
+ $ col = $ type ->convertToPHPValueSQL ($ col , $ this ->platform );
2336
+
2337
+ $ sqlParts [] = $ col . ' AS ' . $ columnAlias ;
2338
+
2339
+ $ this ->scalarResultAliasMap [$ objIndex ][] = $ columnAlias ;
2340
+
2341
+ $ this ->rsm ->addScalarResult ($ columnAlias , $ objIndex , $ mapping ->type );
2342
+
2343
+ if ($ mapping ->enumType !== null ) {
2344
+ $ this ->rsm ->addEnumResult ($ columnAlias , $ mapping ->enumType );
2345
+ }
2346
+
2347
+ $ this ->rsm ->newObjectMappings [$ columnAlias ] = [
2348
+ 'objIndex ' => $ objIndex ,
2349
+ 'argIndex ' => $ aliasGap === null ? $ fieldName : (int ) $ argIndex + $ aliasGap ++,
2350
+ ];
2351
+ }
2352
+
2353
+ return implode (', ' , $ sqlParts );
2354
+ }
2355
+
2295
2356
/**
2296
2357
* @return string The list in parentheses of valid child discriminators from the given class
2297
2358
*
0 commit comments