Skip to content

Commit f71aa73

Browse files
committed
bugfix - add fieldAlias for entities in dto
1 parent c6207b1 commit f71aa73

5 files changed

Lines changed: 176 additions & 5 deletions

File tree

src/Query/AST/EntityAsDtoArgumentExpression.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ class EntityAsDtoArgumentExpression extends Node
1616
public function __construct(
1717
public mixed $expression,
1818
public string|null $identificationVariable,
19+
public string|null $aliasVariable = null,
1920
) {
21+
if (! $aliasVariable) {
22+
$this->aliasVariable = $expression;
23+
}
2024
}
2125

2226
public function dispatch(SqlWalker $walker): string

src/Query/Parser.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,7 @@ public function EntityAsDtoArgumentExpression(): AST\EntityAsDtoArgumentExpressi
11471147
];
11481148
}
11491149

1150-
return new AST\EntityAsDtoArgumentExpression($expression, $identVariable);
1150+
return new AST\EntityAsDtoArgumentExpression($expression, $identVariable, $aliasResultVariable);
11511151
}
11521152

11531153
/**
@@ -1895,6 +1895,7 @@ public function NewObjectArg(string|null &$fieldAlias = null): mixed
18951895
$expression = $this->NewObjectExpression();
18961896
} elseif ($token->type === TokenType::T_IDENTIFIER && $peek->type !== TokenType::T_DOT && $peek->type !== TokenType::T_OPEN_PARENTHESIS) {
18971897
$expression = $this->EntityAsDtoArgumentExpression();
1898+
$fieldAlias = $expression->aliasVariable;
18981899
} else {
18991900
$expression = $this->ScalarExpression();
19001901
}

tests/Tests/Models/CMS/CmsUserDTONamedArgs.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public function __construct(
1313
public int|null $phonenumbers = null,
1414
public CmsAddressDTO|null $addressDto = null,
1515
public CmsAddressDTONamedArgs|null $addressDtoNamedArgs = null,
16+
public CmsDumbDTO|null $dumb = null,
17+
public CmsAddress|null $addressEntity = null,
1618
) {
1719
}
1820
}

tests/Tests/Models/CMS/CmsUserDTOVariadicArg.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ class CmsUserDTOVariadicArg
1010
public string|null $email = null;
1111
public string|null $address = null;
1212
public int|null $phonenumbers = null;
13+
public array $otherProperties = [];
1314

1415
public function __construct(...$args)
1516
{
16-
$this->name = $args['name'] ?? null;
17-
$this->email = $args['email'] ?? null;
18-
$this->phonenumbers = $args['phonenumbers'] ?? null;
19-
$this->address = $args['address'] ?? null;
17+
$this->name = $args['name'] ?? null;
18+
$this->email = $args['email'] ?? null;
19+
$this->phonenumbers = $args['phonenumbers'] ?? null;
20+
$this->address = $args['address'] ?? null;
21+
$this->otherProperties = $args;
2022
}
2123
}

tests/Tests/ORM/Functional/NewOperatorTest.php

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,168 @@ public function testOnlyObjectInDto(): void
13941394
self::assertSame($this->fixtures[2]->email->email, $result[2]->val2->val2);
13951395
}
13961396

1397+
public function testOnlyObjectInNamedDto(): void
1398+
{
1399+
$dql = '
1400+
SELECT
1401+
new named CmsUserDTOVariadicArg(
1402+
a,
1403+
new CmsDumbDTO(
1404+
u.name,
1405+
e.email
1406+
) as dumb
1407+
)
1408+
FROM
1409+
Doctrine\Tests\Models\CMS\CmsUser u
1410+
LEFT JOIN
1411+
u.email e
1412+
LEFT JOIN
1413+
u.address a
1414+
ORDER BY
1415+
u.name';
1416+
1417+
$query = $this->getEntityManager()->createQuery($dql);
1418+
$result = $query->getResult();
1419+
1420+
self::assertCount(3, $result);
1421+
1422+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[0]);
1423+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[1]);
1424+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[2]);
1425+
1426+
self::assertInstanceOf(CmsAddress::class, $result[0]->otherProperties['a']);
1427+
self::assertInstanceOf(CmsAddress::class, $result[1]->otherProperties['a']);
1428+
self::assertInstanceOf(CmsAddress::class, $result[2]->otherProperties['a']);
1429+
1430+
self::assertSame($this->fixtures[0]->address->city, $result[0]->otherProperties['a']->city);
1431+
self::assertSame($this->fixtures[1]->address->city, $result[1]->otherProperties['a']->city);
1432+
self::assertSame($this->fixtures[2]->address->city, $result[2]->otherProperties['a']->city);
1433+
1434+
self::assertSame($this->fixtures[0]->address->country, $result[0]->otherProperties['a']->country);
1435+
self::assertSame($this->fixtures[1]->address->country, $result[1]->otherProperties['a']->country);
1436+
self::assertSame($this->fixtures[2]->address->country, $result[2]->otherProperties['a']->country);
1437+
1438+
self::assertInstanceOf(CmsDumbDTO::class, $result[0]->otherProperties['dumb']);
1439+
self::assertInstanceOf(CmsDumbDTO::class, $result[1]->otherProperties['dumb']);
1440+
self::assertInstanceOf(CmsDumbDTO::class, $result[2]->otherProperties['dumb']);
1441+
1442+
self::assertSame($this->fixtures[0]->name, $result[0]->otherProperties['dumb']->val1);
1443+
self::assertSame($this->fixtures[1]->name, $result[1]->otherProperties['dumb']->val1);
1444+
self::assertSame($this->fixtures[2]->name, $result[2]->otherProperties['dumb']->val1);
1445+
1446+
self::assertSame($this->fixtures[0]->email->email, $result[0]->otherProperties['dumb']->val2);
1447+
self::assertSame($this->fixtures[1]->email->email, $result[1]->otherProperties['dumb']->val2);
1448+
self::assertSame($this->fixtures[2]->email->email, $result[2]->otherProperties['dumb']->val2);
1449+
}
1450+
1451+
public function testOnlyObjectInNamedDtoWithAlias(): void
1452+
{
1453+
$dql = '
1454+
SELECT
1455+
new named CmsUserDTOVariadicArg(
1456+
a as addr,
1457+
new CmsDumbDTO(
1458+
u.name,
1459+
e.email
1460+
) as dumb
1461+
)
1462+
FROM
1463+
Doctrine\Tests\Models\CMS\CmsUser u
1464+
LEFT JOIN
1465+
u.email e
1466+
LEFT JOIN
1467+
u.address a
1468+
ORDER BY
1469+
u.name';
1470+
1471+
$query = $this->getEntityManager()->createQuery($dql);
1472+
$result = $query->getResult();
1473+
1474+
self::assertCount(3, $result);
1475+
1476+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[0]);
1477+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[1]);
1478+
self::assertInstanceOf(CmsUserDTOVariadicArg::class, $result[2]);
1479+
1480+
self::assertInstanceOf(CmsAddress::class, $result[0]->otherProperties['addr']);
1481+
self::assertInstanceOf(CmsAddress::class, $result[1]->otherProperties['addr']);
1482+
self::assertInstanceOf(CmsAddress::class, $result[2]->otherProperties['addr']);
1483+
1484+
self::assertSame($this->fixtures[0]->address->city, $result[0]->otherProperties['addr']->city);
1485+
self::assertSame($this->fixtures[1]->address->city, $result[1]->otherProperties['addr']->city);
1486+
self::assertSame($this->fixtures[2]->address->city, $result[2]->otherProperties['addr']->city);
1487+
1488+
self::assertSame($this->fixtures[0]->address->country, $result[0]->otherProperties['addr']->country);
1489+
self::assertSame($this->fixtures[1]->address->country, $result[1]->otherProperties['addr']->country);
1490+
self::assertSame($this->fixtures[2]->address->country, $result[2]->otherProperties['addr']->country);
1491+
1492+
self::assertInstanceOf(CmsDumbDTO::class, $result[0]->otherProperties['dumb']);
1493+
self::assertInstanceOf(CmsDumbDTO::class, $result[1]->otherProperties['dumb']);
1494+
self::assertInstanceOf(CmsDumbDTO::class, $result[2]->otherProperties['dumb']);
1495+
1496+
self::assertSame($this->fixtures[0]->name, $result[0]->otherProperties['dumb']->val1);
1497+
self::assertSame($this->fixtures[1]->name, $result[1]->otherProperties['dumb']->val1);
1498+
self::assertSame($this->fixtures[2]->name, $result[2]->otherProperties['dumb']->val1);
1499+
1500+
self::assertSame($this->fixtures[0]->email->email, $result[0]->otherProperties['dumb']->val2);
1501+
self::assertSame($this->fixtures[1]->email->email, $result[1]->otherProperties['dumb']->val2);
1502+
self::assertSame($this->fixtures[2]->email->email, $result[2]->otherProperties['dumb']->val2);
1503+
}
1504+
1505+
public function testOnlyObjectInNamedDtoWithSameNameAsTheProperties(): void
1506+
{
1507+
$dql = '
1508+
SELECT
1509+
new named CmsUserDTONamedArgs(
1510+
addressEntity,
1511+
new CmsDumbDTO(
1512+
u.name,
1513+
e.email
1514+
) as dumb
1515+
)
1516+
FROM
1517+
Doctrine\Tests\Models\CMS\CmsUser u
1518+
LEFT JOIN
1519+
u.email e
1520+
LEFT JOIN
1521+
u.address addressEntity
1522+
ORDER BY
1523+
u.name';
1524+
1525+
$query = $this->getEntityManager()->createQuery($dql);
1526+
$result = $query->getResult();
1527+
1528+
self::assertCount(3, $result);
1529+
1530+
self::assertInstanceOf(CmsUserDTONamedArgs::class, $result[0]);
1531+
self::assertInstanceOf(CmsUserDTONamedArgs::class, $result[1]);
1532+
self::assertInstanceOf(CmsUserDTONamedArgs::class, $result[2]);
1533+
1534+
self::assertInstanceOf(CmsAddress::class, $result[0]->addressEntity);
1535+
self::assertInstanceOf(CmsAddress::class, $result[1]->addressEntity);
1536+
self::assertInstanceOf(CmsAddress::class, $result[2]->addressEntity);
1537+
1538+
self::assertSame($this->fixtures[0]->address->city, $result[0]->addressEntity->city);
1539+
self::assertSame($this->fixtures[1]->address->city, $result[1]->addressEntity->city);
1540+
self::assertSame($this->fixtures[2]->address->city, $result[2]->addressEntity->city);
1541+
1542+
self::assertSame($this->fixtures[0]->address->country, $result[0]->addressEntity->country);
1543+
self::assertSame($this->fixtures[1]->address->country, $result[1]->addressEntity->country);
1544+
self::assertSame($this->fixtures[2]->address->country, $result[2]->addressEntity->country);
1545+
1546+
self::assertInstanceOf(CmsDumbDTO::class, $result[0]->dumb);
1547+
self::assertInstanceOf(CmsDumbDTO::class, $result[1]->dumb);
1548+
self::assertInstanceOf(CmsDumbDTO::class, $result[2]->dumb);
1549+
1550+
self::assertSame($this->fixtures[0]->name, $result[0]->dumb->val1);
1551+
self::assertSame($this->fixtures[1]->name, $result[1]->dumb->val1);
1552+
self::assertSame($this->fixtures[2]->name, $result[2]->dumb->val1);
1553+
1554+
self::assertSame($this->fixtures[0]->email->email, $result[0]->dumb->val2);
1555+
self::assertSame($this->fixtures[1]->email->email, $result[1]->dumb->val2);
1556+
self::assertSame($this->fixtures[2]->email->email, $result[2]->dumb->val2);
1557+
}
1558+
13971559
public function testNamedArguments(): void
13981560
{
13991561
$dql = <<<'SQL'

0 commit comments

Comments
 (0)