diff --git a/src/Mpociot/Versionable/Version.php b/src/Mpociot/Versionable/Version.php index bf18534..36cb40d 100644 --- a/src/Mpociot/Versionable/Version.php +++ b/src/Mpociot/Versionable/Version.php @@ -47,13 +47,9 @@ public function getResponsibleUserAttribute() */ public function getModel() { - $modelData = is_resource($this->model_data) - ? stream_get_contents($this->model_data) - : $this->model_data; - $model = new $this->versionable_type(); $model->unguard(); - $model->fill(unserialize($modelData)); + $model->fill($this->modelData()); $model->exists = true; $model->reguard(); return $model; @@ -104,4 +100,24 @@ public function diff(Version $againstVersion = null) return $diffArray; } + /** + * Copy attributes of a model to be saved with the version + * + * @param Model $model + */ + public function copyModelData(Model $model) + { + $this->model_data = serialize($model->attributesToArray()); + } + + /** + * Model attributes + */ + protected function modelData() + { + $serialized = is_resource($this->model_data) + ? stream_get_contents($this->model_data) + : $this->model_data; + return unserialize($serialized); + } } diff --git a/src/Mpociot/Versionable/VersionableTrait.php b/src/Mpociot/Versionable/VersionableTrait.php index cb377ed..8ff0acd 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->copyModelData($this); if (!empty( $this->reason )) { $version->reason = $this->reason; 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