⏱️ Make Laravel model versionable.
It's a minimalist way to make your model support version history, and it's very simple to roll back to the specified version.
- PHP >= 7.4
- laravel/framework >= 5.8|6.0|7.0
- Keep the specified number of versions.
- Whitelist and blacklist for versionable attributes.
- Easily roll back to the specified version.
- Record only changed attributes.
- Easy to customize.
$ composer require overtrue/laravel-versionable -vvvOptional, you can publish the config file:
$ php artisan vendor:publish --provider="Overtrue\LaravelVersionable\ServiceProvider" --tag=configAnd if you want to custom the migration of the versions table, you can publish the migration file to your database path:
$ php artisan vendor:publish --provider="Overtrue\LaravelVersionable\ServiceProvider" --tag=migrationsAfter you published the migration files, please update
'migrations' => falsein the config fileconfig/versionable.phpto disable load the package migrations.
Then run this command to create a database migration:
$ php artisan migrateAdd Overtrue\LaravelVersionable\Versionable trait to the model and set versionable attributes:
use Overtrue\LaravelVersionable\Versionable;
class Post extends Model
{
use Versionable;
/**
* Versionable attributes
*
* @var array
*/
protected $versionable = ['title', 'content'];
<...>
}Versions will be created on vensionable model saved.
$post = Post::create(['title' => 'version1', 'content' => 'version1 content']);
$post->update(['title' => 'version2']);Get all versions
$post->versions;Get latest version
$post->latestVersion;
// or
$post->lastVersion;Reversion a model instance to the specified version:
$post->getVersion(3)->revert();
// or
$post->revertToVersion(3);$newPost = $post->revertWithoutSaving()// soft delete
$post->removeVersion($versionId = 1);
$post->removeVersions($versionIds = [1, 2, 3]);
$post->removeAllVersions();
// force delete
$post->forceRemoveVersion($versionId = 1);
$post->forceRemoveVersions($versionIds = [1, 2, 3]);
$post->forceRemoveAllVersions();$post->restoreTrashedVersion($id);// create
Post::withoutVersion(function () use (&$post) {
Post::create(['title' => 'version1', 'content' => 'version1 content']);
});
// update
Post::withoutVersion(function () use ($post) {
$post->update(['title' => 'updated']);
});You can set the following different version policies through property protected $versionStrategy:
Overtrue\LaravelVersionable::DIFF- Version content will only contain changed attributes (Default Strategy).Overtrue\LaravelVersionable::SNAPSHOT- Version content will contain all versionable attributes values.
You can contribute in one of three ways:
- File bug reports using the issue tracker.
- Answer questions or fix bugs on the issue tracker.
- Contribute new features or update the wiki.
The code contribution process is not very formal. You just need to make sure that you follow the PSR-0, PSR-1, and PSR-2 coding guidelines. Any new code contributions must be accompanied by unit tests where applicable.
MIT

