12
12
use MongoDB \Laravel \Helpers \QueriesRelationships ;
13
13
use MongoDB \Laravel \Internal \FindAndModifyCommandSubscriber ;
14
14
use MongoDB \Model \BSONDocument ;
15
+ use MongoDB \Operation \FindOneAndUpdate ;
15
16
16
17
use function array_intersect_key ;
17
18
use function array_key_exists ;
@@ -201,6 +202,7 @@ public function createOrFirst(array $attributes = [], array $values = []): Model
201
202
}
202
203
203
204
// Apply casting and default values to the attributes
205
+ // In case of duplicate key between the attributes and the values, the values have priority
204
206
$ instance = $ this ->newModelInstance ($ values + $ attributes );
205
207
$ values = $ instance ->getAttributes ();
206
208
$ attributes = array_intersect_key ($ attributes , $ values );
@@ -212,8 +214,12 @@ public function createOrFirst(array $attributes = [], array $values = []): Model
212
214
try {
213
215
$ document = $ collection ->findOneAndUpdate (
214
216
$ attributes ,
215
- ['$setOnInsert ' => $ values ],
216
- ['upsert ' => true , 'new ' => true , 'typeMap ' => ['root ' => 'array ' , 'document ' => 'array ' ]],
217
+ ['$setOnInsert ' => (object ) $ values ],
218
+ [
219
+ 'upsert ' => true ,
220
+ 'returnDocument ' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER ,
221
+ 'typeMap ' => ['root ' => 'array ' , 'document ' => 'array ' ],
222
+ ],
217
223
);
218
224
} finally {
219
225
$ collection ->getManager ()->removeSubscriber ($ listener );
0 commit comments