Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit af499af

Browse files
authored
PHPORM-320 Fix aliasing .id field path to ._id (#3353)
1 parent 9d540b6 commit af499af

File tree

3 files changed

+82
-21
lines changed

3 files changed

+82
-21
lines changed

‎.github/workflows/build-ci.yml‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,24 @@ jobs:
3434
- "11.*"
3535
- "12.*"
3636
driver:
37-
- 1
37+
- 2
3838
include:
3939
- php: "8.1"
4040
laravel: "10.*"
4141
mongodb: "5.0"
4242
mode: "low-deps"
4343
os: "ubuntu-latest"
44-
driver: 1.x
45-
driver_version: "1.21.0"
44+
driver: 1
45+
- php: "8.3"
46+
laravel: "11.*"
47+
mongodb: "8.0"
48+
os: "ubuntu-latest"
49+
driver: 1
4650
- php: "8.4"
4751
laravel: "12.*"
4852
mongodb: "8.0"
4953
os: "ubuntu-latest"
50-
driver: 2
54+
driver: 1
5155
exclude:
5256
- php: "8.1"
5357
laravel: "11.*"

‎src/Query/Builder.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1795,7 +1795,7 @@ private function aliasIdForQuery(array $values, bool $root = true): array
17951795
}
17961796

17971797
// ".id" subfield are alias for "._id"
1798-
if (str_ends_with($key, '.id') && ($root || $this->connection->getRenameEmbeddedIdField())) {
1798+
if (str_ends_with($key, '.id') && $this->connection->getRenameEmbeddedIdField()) {
17991799
$newkey = substr($key, 0, -3) . '._id';
18001800
if (array_key_exists($newkey, $values) && $value !== $values[$newkey]) {
18011801
throw new InvalidArgumentException(sprintf('Cannot have both "%s" and "%s" fields.', $key, $newkey));

‎tests/Query/BuilderTest.php‎

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,29 +1599,86 @@ public static function getEloquentMethodsNotSupported()
15991599
yield 'orWhereIntegerNotInRaw' => [fn (Builder $builder) => $builder->orWhereIntegerNotInRaw('id', ['1a', 2])];
16001600
}
16011601

1602-
public function testRenameEmbeddedIdFieldCanBeDisabled()
1602+
#[DataProvider('provideDisableRenameEmbeddedIdField')]
1603+
public function testDisableRenameEmbeddedIdField(array $expected, Closure $build)
16031604
{
16041605
$builder = $this->getBuilder(false);
16051606
$this->assertFalse($builder->getConnection()->getRenameEmbeddedIdField());
16061607

1607-
$mql = $builder
1608-
->where('id', '=', 10)
1609-
->where('nested.id', '=', 20)
1610-
->where('embed', '=', ['id' => 30])
1611-
->toMql();
1612-
1613-
$this->assertEquals([
1614-
'find' => [
1615-
[
1616-
'$and' => [
1617-
['_id' => 10],
1618-
['nested.id' => 20],
1619-
['embed' => ['id' => 30]],
1608+
$mql = $build($builder)->toMql();
1609+
1610+
$this->assertEquals($expected, $mql);
1611+
}
1612+
1613+
public static function provideDisableRenameEmbeddedIdField()
1614+
{
1615+
yield 'rename embedded id field' => [
1616+
[
1617+
'find' => [
1618+
[
1619+
'$and' => [
1620+
['_id' => 10],
1621+
['nested.id' => 20],
1622+
['embed' => ['id' => 30]],
1623+
],
1624+
],
1625+
['typeMap' => ['root' => 'object', 'document' => 'array']],
1626+
],
1627+
],
1628+
fn (Builder $builder) => $builder->where('id', '=', 10)
1629+
->where('nested.id', '=', 20)
1630+
->where('embed', '=', ['id' => 30]),
1631+
];
1632+
1633+
yield 'rename root id' => [
1634+
['find' => [['_id' => 10], ['typeMap' => ['root' => 'object', 'document' => 'array']]]],
1635+
fn (Builder $builder) => $builder->where('id', '=', 10),
1636+
];
1637+
1638+
yield 'nested id not renamed' => [
1639+
['find' => [['nested.id' => 20], ['typeMap' => ['root' => 'object', 'document' => 'array']]]],
1640+
fn (Builder $builder) => $builder->where('nested.id', '=', 20),
1641+
];
1642+
1643+
yield 'embed id not renamed' => [
1644+
['find' => [['embed' => ['id' => 30]], ['typeMap' => ['root' => 'object', 'document' => 'array']]]],
1645+
fn (Builder $builder) => $builder->where('embed', '=', ['id' => 30]),
1646+
];
1647+
1648+
yield 'nested $and in $or' => [
1649+
[
1650+
'find' => [
1651+
[
1652+
'$or' => [
1653+
[
1654+
'$and' => [
1655+
['_id' => 10],
1656+
['nested.id' => 20],
1657+
['embed' => ['id' => 30]],
1658+
],
1659+
],
1660+
[
1661+
'$and' => [
1662+
['_id' => 40],
1663+
['nested.id' => 50],
1664+
['embed' => ['id' => 60]],
1665+
],
1666+
],
1667+
],
16201668
],
1669+
['typeMap' => ['root' => 'object', 'document' => 'array']],
16211670
],
1622-
['typeMap' => ['root' => 'object', 'document' => 'array']],
16231671
],
1624-
], $mql);
1672+
fn (Builder $builder) => $builder->orWhere(function (Builder $builder) {
1673+
return $builder->where('id', '=', 10)
1674+
->where('nested.id', '=', 20)
1675+
->where('embed', '=', ['id' => 30]);
1676+
})->orWhere(function (Builder $builder) {
1677+
return $builder->where('id', '=', 40)
1678+
->where('nested.id', '=', 50)
1679+
->where('embed', '=', ['id' => 60]);
1680+
}),
1681+
];
16251682
}
16261683

16271684
private function getBuilder(bool $renameEmbeddedIdField = true): Builder

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /