diff --git a/src/Eloquent/Builder.php b/src/Eloquent/Builder.php index f85570575..aabc526f7 100644 --- a/src/Eloquent/Builder.php +++ b/src/Eloquent/Builder.php @@ -18,7 +18,7 @@ use MongoDB\Model\BSONDocument; use function array_key_exists; -use function array_merge; +use function array_replace; use function collect; use function is_array; use function is_object; @@ -270,7 +270,7 @@ public function firstOrCreate(array $attributes = [], array $values = []) // createOrFirst is not supported in transaction. if ($this->getConnection()->getSession()?->isInTransaction()) { - return $this->create(array_merge($attributes, $values)); + return $this->create(array_replace($attributes, $values)); } return $this->createOrFirst($attributes, $values); @@ -284,7 +284,7 @@ public function createOrFirst(array $attributes = [], array $values = []) } try { - return $this->create(array_merge($attributes, $values)); + return $this->create(array_replace($attributes, $values)); } catch (BulkWriteException $e) { if ($e->getCode() === self::DUPLICATE_KEY_ERROR) { return $this->where($attributes)->first() ?? throw $e; @@ -309,7 +309,7 @@ protected function addUpdatedAtColumn(array $values) } $column = $this->model->getUpdatedAtColumn(); - $values = array_merge( + $values = array_replace( [$column => $this->model->freshTimestampString()], $values, ); diff --git a/src/Eloquent/DocumentModel.php b/src/Eloquent/DocumentModel.php index 930ed6286..d39a12401 100644 --- a/src/Eloquent/DocumentModel.php +++ b/src/Eloquent/DocumentModel.php @@ -30,7 +30,7 @@ use function array_key_exists; use function array_keys; -use function array_merge; +use function array_replace; use function array_unique; use function array_values; use function class_basename; @@ -192,7 +192,7 @@ protected function transformModelValue($key, $value) // to a Carbon or CarbonImmutable instance. // @see Model::setAttribute() if ($this->hasCast($key) && $value instanceof CarbonInterface) { - $value->settings(array_merge($value->getSettings(), ['toStringFormat' => $this->getDateFormat()])); + $value->settings(array_replace($value->getSettings(), ['toStringFormat' => $this->getDateFormat()])); // "date" cast resets the time to 00:00:00. $castType = $this->getCasts()[$key]; diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 5c873380b..07a3483b0 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -40,6 +40,7 @@ use function array_key_exists; use function array_map; use function array_merge; +use function array_replace; use function array_values; use function assert; use function blank; @@ -426,7 +427,7 @@ public function toMql(): array // Add custom query options if (count($this->options)) { - $options = array_merge($options, $this->options); + $options = array_replace($options, $this->options); } $options = $this->inheritConnectionOptions($options); @@ -450,7 +451,7 @@ public function toMql(): array // Add custom projections. if ($this->projections) { - $projection = array_merge($projection, $this->projections); + $projection = array_replace($projection, $this->projections); } $options = []; @@ -484,7 +485,7 @@ public function toMql(): array // Add custom query options if (count($this->options)) { - $options = array_merge($options, $this->options); + $options = array_replace($options, $this->options); } $options = $this->inheritConnectionOptions($options); diff --git a/src/Relations/BelongsToMany.php b/src/Relations/BelongsToMany.php index a150fccf7..042ec22ce 100644 --- a/src/Relations/BelongsToMany.php +++ b/src/Relations/BelongsToMany.php @@ -14,7 +14,7 @@ use function array_diff; use function array_keys; use function array_map; -use function array_merge; +use function array_replace; use function array_values; use function assert; use function count; @@ -164,7 +164,7 @@ public function sync($ids, $detaching = true) // Now we are finally ready to attach the new records. Note that we'll disable // touching until after the entire operation is complete so we don't fire a // ton of touch operations until we are totally done syncing the records. - $changes = array_merge( + $changes = array_replace( $changes, $this->attachNew($records, $current, false), ); diff --git a/src/Relations/MorphToMany.php b/src/Relations/MorphToMany.php index 929738360..a1514d235 100644 --- a/src/Relations/MorphToMany.php +++ b/src/Relations/MorphToMany.php @@ -15,8 +15,8 @@ use function array_key_exists; use function array_keys; use function array_map; -use function array_merge; use function array_reduce; +use function array_replace; use function array_values; use function collect; use function count; @@ -190,7 +190,7 @@ public function sync($ids, $detaching = true) // Now we are finally ready to attach the new records. Note that we'll disable // touching until after the entire operation is complete so we don't fire a // ton of touch operations until we are totally done syncing the records. - $changes = array_merge( + $changes = array_replace( $changes, $this->attachNew($records, $current, false), ); diff --git a/src/Scout/ScoutEngine.php b/src/Scout/ScoutEngine.php index dc70a39e2..9455608bb 100644 --- a/src/Scout/ScoutEngine.php +++ b/src/Scout/ScoutEngine.php @@ -29,7 +29,7 @@ use function array_column; use function array_flip; use function array_map; -use function array_merge; +use function array_replace; use function assert; use function call_user_func; use function class_uses_recursive; @@ -117,7 +117,7 @@ public function update($models) unset($searchableData['_id']); - $searchableData = array_merge($searchableData, $model->scoutMetadata()); + $searchableData = array_replace($searchableData, $model->scoutMetadata()); /** Convert the __soft_deleted set by {@see Searchable::pushSoftDeleteMetadata()} * into a boolean for efficient storage and indexing. */ diff --git a/tests/Ticket/GH3335Test.php b/tests/Ticket/GH3335Test.php new file mode 100644 index 000000000..f37782a4b --- /dev/null +++ b/tests/Ticket/GH3335Test.php @@ -0,0 +1,33 @@ +id = 'foo'; + $model->save(); + + $model = Location::find('foo'); + $model->{'38'} = 'PHP'; + $model->save(); + + $model = Location::find('foo'); + self::assertSame('PHP', $model->{'38'}); + } +}