From 3d3cb0600a34ebcc919586dec1e4a5d3d242ef13 Mon Sep 17 00:00:00 2001 From: Yaohan Chen Date: Fri, 16 Nov 2018 14:23:06 -0500 Subject: [PATCH 1/2] Add failing testcase for model with a JSON field --- tests/VersionableTest.php | 16 ++++++++++++++++ tests/VersionableTestCase.php | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/tests/VersionableTest.php b/tests/VersionableTest.php index 6160b57..073a0a1 100644 --- a/tests/VersionableTest.php +++ b/tests/VersionableTest.php @@ -289,6 +289,15 @@ public function testGetVersionModel() } + public function testGetVersionModelWithJsonField() + { + $model = new ModelWithJsonField(); + $model->json_field = ["foo" => "bar"]; + $model->save(); + + $this->assertEquals(["foo" => "bar"], $model->getVersionModel(1)->json_field); + } + public function testUseReasonAttribute() { // Create 3 versions @@ -547,4 +556,11 @@ class ModelWithDynamicVersion extends Model use VersionableTrait ; protected $versionClass = DynamicVersionModel::class ; } +class ModelWithJsonField extends Model +{ + const TABLENAME = 'table_with_json_field'; + public $table = self::TABLENAME ; + use VersionableTrait ; + protected $casts = ['json_field' => 'array']; +} diff --git a/tests/VersionableTestCase.php b/tests/VersionableTestCase.php index c09e36b..52c4cbd 100644 --- a/tests/VersionableTestCase.php +++ b/tests/VersionableTestCase.php @@ -65,5 +65,11 @@ public function migrateUsersTable() $table->index('versionable_id'); $table->timestamps(); }); + + $this->app['db']->connection()->getSchemaBuilder()->create(ModelWithJsonField::TABLENAME, function ($table) { + $table->increments('id'); + $table->json('json_field'); + $table->timestamps(); + }); } } \ No newline at end of file From 5d0aa7179c6f171292a75b09760ab26e7eb2fbf5 Mon Sep 17 00:00:00 2001 From: Yaohan Chen Date: Fri, 16 Nov 2018 14:38:52 -0500 Subject: [PATCH 2/2] Fix saving version of model with JSON field When a model uses `$casts = ['field' => 'array']` with a JSON field, getAttributes() will return the JSON-encoded string, while $model->fill() expects the input to contain the un-encoded JSON value. So instead, use attributesToArray() to get the model data, which will work properly with fill(). Fixes #43 --- src/Mpociot/Versionable/VersionableTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mpociot/Versionable/VersionableTrait.php b/src/Mpociot/Versionable/VersionableTrait.php index cb377ed..ffca6c6 100644 --- a/src/Mpociot/Versionable/VersionableTrait.php +++ b/src/Mpociot/Versionable/VersionableTrait.php @@ -175,7 +175,7 @@ protected function versionablePostSave() $version->versionable_id = $this->getKey(); $version->versionable_type = get_class($this); $version->user_id = $this->getAuthUserId(); - $version->model_data = serialize($this->getAttributes()); + $version->model_data = serialize($this->attributesToArray()); if (!empty( $this->reason )) { $version->reason = $this->reason;