diff --git a/src/Eloquent/Model.php b/src/Eloquent/Model.php index 05a20bb31..5c88dee0e 100644 --- a/src/Eloquent/Model.php +++ b/src/Eloquent/Model.php @@ -20,6 +20,7 @@ use function abs; use function array_key_exists; +use function array_key_first; use function array_keys; use function array_unique; use function array_values; @@ -251,6 +252,16 @@ public function attributesToArray() return $attributes; } + /** @inheritdoc */ + protected function normalizeCastClassResponse($key, $value) + { + if (! is_array($value) || (count($value) && is_numeric(array_key_first($value)))) { + return [$key => $value]; + } + + return $value; + } + /** @inheritdoc */ public function getCasts() { diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 44e24b699..6b98ff90e 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -112,8 +112,20 @@ public function testUpdate(): void $raw = $user->getAttributes(); $this->assertInstanceOf(ObjectID::class, $raw['_id']); + $check->skills = ['PHP', 'Laravel', 'MongoDB', 'Laravel']; + $check->save(); + + $check = User::find($user->_id); + $this->assertCount(3, $check->skills); + $this->assertEquals(['PHP', 'Laravel', 'MongoDB'], $check->skills); + + $check->fullname = ['Hans', 'Thomas']; + $check->save(); + $check = User::find($user->_id); - $this->assertEquals(20, $check->age); + self::assertEquals('Hans', $check->first_name); + self::assertEquals('Thomas', $check->last_name); + self::assertEquals('Hans Thomas', $check->fullname); } public function testManualStringId(): void diff --git a/tests/Models/User.php b/tests/Models/User.php index 523b489e7..8bcd08f55 100644 --- a/tests/Models/User.php +++ b/tests/Models/User.php @@ -18,6 +18,8 @@ use MongoDB\Laravel\Eloquent\MassPrunable; use MongoDB\Laravel\Eloquent\Model as Eloquent; +use function array_unique; + /** * @property string $_id * @property string $name @@ -109,6 +111,22 @@ protected function username(): Attribute ); } + protected function skills(): Attribute + { + return Attribute::make( + get: fn ($value) => $value, + set: fn ($values) => array_unique($values) + ); + } + + protected function fullname(): Attribute + { + return Attribute::make( + get: fn ($value) => $this->first_name . ' ' . $this->last_name, + set: fn ($values) => ['first_name' => $values[0], 'last_name' => $values[1]] + ); + } + public function prunable(): Builder { return $this->where('age', '>', 18);