Skip to content

Commit 440ccb0

Browse files
authored
[11.x] Fix flat array parameter for relation upsert (#52289)
* [11.x] Fix flat arrays for relation upsert * add once
1 parent 8564950 commit 440ccb0

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,10 @@ public function updateOrCreate(array $attributes, array $values = [])
286286
*/
287287
public function upsert(array $values, $uniqueBy, $update = null)
288288
{
289+
if (! empty($values) && ! is_array(reset($values))) {
290+
$values = [$values];
291+
}
292+
289293
foreach ($values as $key => $value) {
290294
$values[$key][$this->getForeignKeyName()] = $this->getParentKey();
291295
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ protected function setForeignAttributesForCreate(Model $model)
106106
*/
107107
public function upsert(array $values, $uniqueBy, $update = null)
108108
{
109+
if (! empty($values) && ! is_array(reset($values))) {
110+
$values = [$values];
111+
}
112+
109113
foreach ($values as $key => $value) {
110114
$values[$key][$this->getMorphType()] = $this->getMorphClass();
111115
}

tests/Database/DatabaseEloquentHasManyTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,21 @@ public function testRelationUpsertFillsForeignKey()
257257
{
258258
$relation = $this->getRelation();
259259

260-
$relation->getQuery()->shouldReceive('upsert')->with(
260+
$relation->getQuery()->shouldReceive('upsert')->once()->with(
261+
[
262+
['email' => 'foo3', 'name' => 'bar', $relation->getForeignKeyName() => $relation->getParentKey()],
263+
],
264+
['email'],
265+
['name']
266+
);
267+
268+
$relation->upsert(
269+
['email' => 'foo3', 'name' => 'bar'],
270+
['email'],
271+
['name']
272+
);
273+
274+
$relation->getQuery()->shouldReceive('upsert')->once()->with(
261275
[
262276
['email' => 'foo3', 'name' => 'bar', $relation->getForeignKeyName() => $relation->getParentKey()],
263277
['name' => 'bar2', 'email' => 'foo2', $relation->getForeignKeyName() => $relation->getParentKey()],

tests/Database/DatabaseEloquentMorphTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,21 @@ public function testMorphRelationUpsertFillsForeignKey()
7171
{
7272
$relation = $this->getManyRelation();
7373

74-
$relation->getQuery()->shouldReceive('upsert')->with(
74+
$relation->getQuery()->shouldReceive('upsert')->once()->with(
75+
[
76+
['email' => 'foo3', 'name' => 'bar', $relation->getForeignKeyName() => $relation->getParentKey(), $relation->getMorphType() => $relation->getMorphClass()],
77+
],
78+
['email'],
79+
['name']
80+
);
81+
82+
$relation->upsert(
83+
['email' => 'foo3', 'name' => 'bar'],
84+
['email'],
85+
['name']
86+
);
87+
88+
$relation->getQuery()->shouldReceive('upsert')->once()->with(
7589
[
7690
['email' => 'foo3', 'name' => 'bar', $relation->getForeignKeyName() => $relation->getParentKey(), $relation->getMorphType() => $relation->getMorphClass()],
7791
['name' => 'bar2', 'email' => 'foo2', $relation->getForeignKeyName() => $relation->getParentKey(), $relation->getMorphType() => $relation->getMorphClass()],

0 commit comments

Comments
 (0)