Skip to content

Commit 4b35f74

Browse files
committed
Make the updateOrCreate methods in relations use firstOrCreate behind the scenes
Related to laravel#48160, laravel#48192
1 parent 4c5d4d5 commit 4b35f74

File tree

3 files changed

+14
-18
lines changed

3 files changed

+14
-18
lines changed

src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -672,17 +672,13 @@ public function createOrFirst(array $attributes = [], array $values = [], array
672672
*/
673673
public function updateOrCreate(array $attributes, array $values = [], array $joining = [], $touch = true)
674674
{
675-
if (is_null($instance = (clone $this)->where($attributes)->first())) {
676-
if (is_null($instance = $this->related->where($attributes)->first())) {
677-
return $this->create(array_merge($attributes, $values), $joining, $touch);
678-
} else {
679-
$this->attach($instance, $joining, $touch);
680-
}
681-
}
675+
$instance = $this->firstOrCreate($attributes, $values, $joining, $touch);
682676

683-
$instance->fill($values);
677+
if (! $instance->wasRecentlyCreated) {
678+
$instance->fill($values);
684679

685-
$instance->save(['touch' => false]);
680+
$instance->save(['touch' => false]);
681+
}
686682

687683
return $instance;
688684
}

src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,11 @@ public function firstOrNew(array $attributes)
271271
*/
272272
public function updateOrCreate(array $attributes, array $values = [])
273273
{
274-
$instance = $this->firstOrNew($attributes);
275-
276-
$instance->fill($values)->save();
277-
278-
return $instance;
274+
return tap($this->firstOrCreate($attributes, $values), function ($instance) use ($values) {
275+
if (! $instance->wasRecentlyCreated) {
276+
$instance->fill($values)->save();
277+
}
278+
});
279279
}
280280

281281
/**

src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,10 @@ public function createOrFirst(array $attributes = [], array $values = [])
267267
*/
268268
public function updateOrCreate(array $attributes, array $values = [])
269269
{
270-
return tap($this->firstOrNew($attributes), function ($instance) use ($values) {
271-
$instance->fill($values);
272-
273-
$instance->save();
270+
return tap($this->firstOrCreate($attributes, $values), function ($instance) use ($values) {
271+
if (! $instance->wasRecentlyCreated) {
272+
$instance->fill($values)->save();
273+
}
274274
});
275275
}
276276

0 commit comments

Comments
 (0)