4
4
5
5
namespace Doctrine \ODM \MongoDB \Tests \Functional \Ticket ;
6
6
7
+ use Doctrine \Common \Collections \ArrayCollection ;
8
+ use Doctrine \Common \Collections \Collection ;
7
9
use Doctrine \ODM \MongoDB \Mapping \Annotations as ODM ;
8
10
use Doctrine \ODM \MongoDB \Mapping \ClassMetadata ;
9
11
use Doctrine \ODM \MongoDB \Tests \BaseTestCase ;
10
12
use MongoDB \BSON \ObjectId ;
11
13
12
14
class GH2825Test extends BaseTestCase
13
15
{
14
- public function testQueryBuilderUpdatesEmbeddedDocumentCorrectly (): void
16
+ public function testQueryBuilderUpdatesEmbedOneCorrectly (): void
15
17
{
16
18
$ document = new GH2825Document ('foo ' );
17
19
$ document ->embedded = new GH2825Embedded ('level 1 ' );
@@ -37,7 +39,62 @@ public function testQueryBuilderUpdatesEmbeddedDocumentCorrectly(): void
37
39
self ::assertSame ('level 2 ' , $ result ['embedded ' ]['embedded ' ]['renamed ' ]);
38
40
}
39
41
40
- public function testQueryBuilderUpdatesReferencesCorrectly (): void
42
+ public function testQueryBuilderUpdatesEmbedManyCorrectly (): void
43
+ {
44
+ $ document = new GH2825Document ('foo ' );
45
+ $ document ->embeddedDocuments [] = new GH2825Embedded ('level 1 ' );
46
+
47
+ $ this ->dm ->persist ($ document );
48
+ $ this ->dm ->flush ();
49
+
50
+ $ embedded = new GH2825Embedded ('level 2 ' );
51
+
52
+ $ this ->dm ->persist ($ embedded );
53
+
54
+ $ this ->dm ->createQueryBuilder (GH2825Document::class)
55
+ ->updateOne ()
56
+ ->field ('id ' )->equals ($ document ->id )
57
+ ->field ('embeddedDocuments.property ' )->equals ('level 1 ' )
58
+ ->field ('embeddedDocuments.$.embedded ' )->set ($ embedded )
59
+ ->getQuery ()
60
+ ->execute ();
61
+
62
+ $ result = $ this ->dm ->getDocumentCollection (GH2825Document::class)
63
+ ->findOne (['_id ' => new ObjectId ($ document ->id )]);
64
+
65
+ self ::assertIsArray ($ result ['embeddedDocuments ' ]);
66
+ self ::assertSame ('level 1 ' , $ result ['embeddedDocuments ' ][0 ]['renamed ' ]);
67
+ self ::assertSame ('level 2 ' , $ result ['embeddedDocuments ' ][0 ]['embedded ' ]['renamed ' ]);
68
+ }
69
+
70
+ public function testQueryBuilderReplacesEmbedManyCorrectly (): void
71
+ {
72
+ $ document = new GH2825Document ('foo ' );
73
+ $ document ->embeddedDocuments [] = new GH2825Embedded ('original ' );
74
+
75
+ $ this ->dm ->persist ($ document );
76
+ $ this ->dm ->flush ();
77
+
78
+ $ embedded = new GH2825Embedded ('replaced ' );
79
+
80
+ $ this ->dm ->persist ($ embedded );
81
+
82
+ $ this ->dm ->createQueryBuilder (GH2825Document::class)
83
+ ->updateOne ()
84
+ ->field ('id ' )->equals ($ document ->id )
85
+ ->field ('embeddedDocuments.property ' )->equals ('original ' )
86
+ ->field ('embeddedDocuments.$ ' )->set ($ embedded )
87
+ ->getQuery ()
88
+ ->execute ();
89
+
90
+ $ result = $ this ->dm ->getDocumentCollection (GH2825Document::class)
91
+ ->findOne (['_id ' => new ObjectId ($ document ->id )]);
92
+
93
+ self ::assertIsArray ($ result ['embeddedDocuments ' ]);
94
+ self ::assertSame ('replaced ' , $ result ['embeddedDocuments ' ][0 ]['renamed ' ]);
95
+ }
96
+
97
+ public function testQueryBuilderUpdatesReferenceOneCorrectly (): void
41
98
{
42
99
$ document = new GH2825Document ('document ' );
43
100
$ document ->embedded = new GH2825Embedded ('embedded ' );
@@ -73,6 +130,77 @@ public function testQueryBuilderUpdatesReferencesCorrectly(): void
73
130
self ::assertEquals (['id ' => $ referenceId ], $ result ['embedded ' ]['referenceStoreAsRef ' ]);
74
131
self ::assertEquals (['$ref ' => 'GH2825Document ' , '$id ' => $ referenceId ], $ result ['embedded ' ]['referenceStoreAsDbRef ' ]);
75
132
}
133
+
134
+ public function testQueryBuilderUpdatesReferenceManyCorrectly (): void
135
+ {
136
+ $ document = new GH2825Document ('document ' );
137
+ $ document ->embeddedDocuments [] = new GH2825Embedded ('embedded ' );
138
+ $ reference = new GH2825Document ('referenced ' );
139
+
140
+ $ this ->dm ->persist ($ document );
141
+ $ this ->dm ->persist ($ reference );
142
+
143
+ $ this ->dm ->flush ();
144
+
145
+ $ this ->dm ->createQueryBuilder (GH2825Document::class)
146
+ ->updateOne ()
147
+ ->field ('id ' )->equals ($ document ->id )
148
+ ->field ('embeddedDocuments.property ' )->equals ('embedded ' )
149
+ ->field ('embeddedDocuments.$.referenceStoreAsId ' )->set ($ reference )
150
+ ->field ('embeddedDocuments.$.referenceStoreAsRef ' )->set ($ reference )
151
+ ->field ('embeddedDocuments.$.referenceStoreAsDbRef ' )->set ($ reference )
152
+ ->getQuery ()
153
+ ->execute ();
154
+
155
+ $ result = $ this ->dm ->getDocumentCollection (GH2825Document::class)
156
+ ->findOne (['_id ' => new ObjectId ($ document ->id )], ['typeMap ' => ['root ' => 'array ' , 'document ' => 'array ' ]]);
157
+
158
+ $ referenceId = new ObjectId ($ reference ->id );
159
+
160
+ self ::assertIsArray ($ result ['embeddedDocuments ' ]);
161
+
162
+ self ::assertEquals ($ referenceId , $ result ['embeddedDocuments ' ][0 ]['referenceStoreAsId ' ]);
163
+ self ::assertEquals (['id ' => $ referenceId ], $ result ['embeddedDocuments ' ][0 ]['referenceStoreAsRef ' ]);
164
+ self ::assertEquals (['$ref ' => 'GH2825Document ' , '$id ' => $ referenceId ], $ result ['embeddedDocuments ' ][0 ]['referenceStoreAsDbRef ' ]);
165
+ }
166
+
167
+ public function testQueryBuilderReplacesReferenceManyCorrectly (): void
168
+ {
169
+ $ document = new GH2825Document ('document ' );
170
+ $ reference = new GH2825Document ('original ' );
171
+ $ otherReference = new GH2825Document ('original ' );
172
+ $ document ->referencedDocumentsStoreAsId [] = $ reference ;
173
+ $ document ->referencedDocumentsStoreAsRef [] = $ reference ;
174
+ $ document ->referencedDocumentsStoreAsDbRef [] = $ reference ;
175
+
176
+ $ this ->dm ->persist ($ document );
177
+ $ this ->dm ->persist ($ reference );
178
+ $ this ->dm ->persist ($ otherReference );
179
+
180
+ $ this ->dm ->flush ();
181
+
182
+ $ this ->dm ->createQueryBuilder (GH2825Document::class)
183
+ ->updateOne ()
184
+ ->field ('id ' )->equals ($ document ->id )
185
+ ->field ('referencedDocumentsStoreAsId.0 ' )->set ($ otherReference )
186
+ ->field ('referencedDocumentsStoreAsRef.0 ' )->set ($ otherReference )
187
+ ->field ('referencedDocumentsStoreAsDbRef.0 ' )->set ($ otherReference )
188
+ ->getQuery ()
189
+ ->execute ();
190
+
191
+ $ result = $ this ->dm ->getDocumentCollection (GH2825Document::class)
192
+ ->findOne (['_id ' => new ObjectId ($ document ->id )], ['typeMap ' => ['root ' => 'array ' , 'document ' => 'array ' ]]);
193
+
194
+ $ referenceId = new ObjectId ($ otherReference ->id );
195
+
196
+ self ::assertIsArray ($ result ['referencedDocumentsStoreAsId ' ]);
197
+ self ::assertIsArray ($ result ['referencedDocumentsStoreAsRef ' ]);
198
+ self ::assertIsArray ($ result ['referencedDocumentsStoreAsDbRef ' ]);
199
+
200
+ self ::assertEquals ($ referenceId , $ result ['referencedDocumentsStoreAsId ' ][0 ]);
201
+ self ::assertEquals (['id ' => $ referenceId ], $ result ['referencedDocumentsStoreAsRef ' ][0 ]);
202
+ self ::assertEquals (['$ref ' => 'GH2825Document ' , '$id ' => $ referenceId ], $ result ['referencedDocumentsStoreAsDbRef ' ][0 ]);
203
+ }
76
204
}
77
205
78
206
#[ODM \Document]
@@ -96,9 +224,29 @@ class GH2825Document
96
224
#[ODM \ReferenceOne(targetDocument: self ::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_DB_REF )]
97
225
public GH2825Document |null $ referenceStoreAsDbRef = null ;
98
226
227
+ /** @var Collection<int, GH2825Embedded> */
228
+ #[ODM \EmbedMany(targetDocument: GH2825Embedded::class)]
229
+ public Collection $ embeddedDocuments ;
230
+
231
+ /** @var Collection<int, GH2825Document> */
232
+ #[ODM \ReferenceMany(targetDocument: self ::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_ID )]
233
+ public Collection $ referencedDocumentsStoreAsId ;
234
+
235
+ /** @var Collection<int, GH2825Document> */
236
+ #[ODM \ReferenceMany(targetDocument: self ::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_REF )]
237
+ public Collection $ referencedDocumentsStoreAsRef ;
238
+
239
+ /** @var Collection<int, GH2825Document> */
240
+ #[ODM \ReferenceMany(targetDocument: self ::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_DB_REF )]
241
+ public Collection $ referencedDocumentsStoreAsDbRef ;
242
+
99
243
public function __construct (string $ name )
100
244
{
101
- $ this ->name = $ name ;
245
+ $ this ->name = $ name ;
246
+ $ this ->embeddedDocuments = new ArrayCollection ();
247
+ $ this ->referencedDocumentsStoreAsId = new ArrayCollection ();
248
+ $ this ->referencedDocumentsStoreAsRef = new ArrayCollection ();
249
+ $ this ->referencedDocumentsStoreAsDbRef = new ArrayCollection ();
102
250
}
103
251
}
104
252
@@ -120,8 +268,28 @@ class GH2825Embedded
120
268
#[ODM \ReferenceOne(targetDocument: GH2825Document::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_DB_REF )]
121
269
public GH2825Document |null $ referenceStoreAsDbRef = null ;
122
270
271
+ /** @var Collection<int, GH2825Embedded> */
272
+ #[ODM \EmbedMany(targetDocument: self ::class)]
273
+ public Collection $ embeddedDocuments ;
274
+
275
+ /** @var Collection<int, GH2825Document> */
276
+ #[ODM \ReferenceMany(targetDocument: GH2825Document::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_ID )]
277
+ public Collection $ referencedDocumentsStoreAsId ;
278
+
279
+ /** @var Collection<int, GH2825Document> */
280
+ #[ODM \ReferenceMany(targetDocument: GH2825Document::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_REF )]
281
+ public Collection $ referencedDocumentsStoreAsRef ;
282
+
283
+ /** @var Collection<int, GH2825Document> */
284
+ #[ODM \ReferenceMany(targetDocument: GH2825Document::class, storeAs: ClassMetadata::REFERENCE_STORE_AS_DB_REF )]
285
+ public Collection $ referencedDocumentsStoreAsDbRef ;
286
+
123
287
public function __construct (string $ property )
124
288
{
125
- $ this ->property = $ property ;
289
+ $ this ->property = $ property ;
290
+ $ this ->embeddedDocuments = new ArrayCollection ();
291
+ $ this ->referencedDocumentsStoreAsId = new ArrayCollection ();
292
+ $ this ->referencedDocumentsStoreAsRef = new ArrayCollection ();
293
+ $ this ->referencedDocumentsStoreAsDbRef = new ArrayCollection ();
126
294
}
127
295
}
0 commit comments