diff --git a/src/Illuminate/Database/Eloquent/Model.php b/src/Illuminate/Database/Eloquent/Model.php index cb36dd411b36..43d26c8a5733 100644 --- a/src/Illuminate/Database/Eloquent/Model.php +++ b/src/Illuminate/Database/Eloquent/Model.php @@ -29,6 +29,7 @@ use Illuminate\Support\Collection as BaseCollection; use Illuminate\Support\Str; use Illuminate\Support\Stringable as SupportStringable; +use Illuminate\Support\Traits\Dumpable; use Illuminate\Support\Traits\ForwardsCalls; use JsonException; use JsonSerializable; @@ -54,6 +55,10 @@ abstract class Model implements Arrayable, ArrayAccess, CanBeEscapedWhenCastToSt ForwardsCalls; /** @use HasCollection<\Illuminate\Database\Eloquent\Collection> */ use HasCollection; + use Dumpable { + dump as protected; + dd as protected; + } /** * The connection name for the model. @@ -2791,7 +2796,7 @@ public function __unset($key) */ public function __call($method, $parameters) { - if (in_array($method, ['increment', 'decrement', 'incrementQuietly', 'decrementQuietly', 'incrementEach', 'decrementEach'])) { + if (in_array($method, ['increment', 'decrement', 'incrementQuietly', 'decrementQuietly', 'incrementEach', 'decrementEach', 'dd', 'dump'])) { return $this->$method(...$parameters); } @@ -2816,7 +2821,7 @@ public function __call($method, $parameters) */ public static function __callStatic($method, $parameters) { - if (static::isScopeMethodWithAttribute($method)) { + if (in_array($method, ['dd', 'dump']) || static::isScopeMethodWithAttribute($method)) { return static::query()->$method(...$parameters); } diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index 0930a9c07f24..dd3314b8b0c7 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -61,6 +61,7 @@ use ReflectionClass; use stdClass; use Stringable as NativeStringable; +use Symfony\Component\VarDumper\VarDumper; include_once 'Enums.php'; @@ -750,6 +751,36 @@ public function testDestroyMethodCallsQueryBuilderCorrectlyWithEmptyIds() $this->assertSame(0, $count); } + public function testDumpMethodDumpsModelInstanceAndReturnsIt() + { + $log = new BaseCollection; + + VarDumper::setHandler(function ($value) use ($log) { + $log->add($value); + }); + + try { + $model = new EloquentModelStub; + + $result = $model->dump('one', 'two'); + + $this->assertSame($model, $result); + $this->assertSame([$model, 'one', 'two'], $log->all()); + } finally { + VarDumper::setHandler(null); + } + } + + public function testDumpMethodCallsQueryBuilderCorrectly() + { + EloquentModelDumpStub::$arguments = []; + + $result = EloquentModelDumpStub::dump('one', 'two'); + + $this->assertSame('foo', $result); + $this->assertSame(['one', 'two'], EloquentModelDumpStub::$arguments); + } + public function testWithMethodCallsQueryBuilderCorrectly() { $result = EloquentModelWithStub::with('foo', 'bar'); @@ -4136,6 +4167,24 @@ public function newQuery() } } +class EloquentModelDumpStub extends Model +{ + public static $arguments = []; + + public function newQuery() + { + return new class + { + public function dump(...$arguments) + { + EloquentModelDumpStub::$arguments = $arguments; + + return 'foo'; + } + }; + } +} + class EloquentModelWithWhereHasStub extends Model { public function foo()