pedrocruzlopez / versionable
由 mpociot/versionable 分支而来,允许创建 Laravel 4 / 5 / 6 / 7 / 8 / 9 模型版本控制和恢复
Requires
- php: ^7.3|^8.0
- illuminate/support: ~5.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^3.1 || ^4.0 || ^5.0 || ^6.0
- phpunit/phpunit: ^7.0 || ^8.0 || ^9.0
README
Laravel 模型版本控制变得简单
跟踪所有模型更改,并回滚到以前的版本。
// Restore to the previous change $content->previousVersion()->revert(); // Get model from a version $oldModel = Version::find(100)->getModel();
安装
您可以通过 composer 安装
composer require mpociot/versionable
运行迁移。
php artisan migrate --path=vendor/mpociot/versionable/src/migrations
或者,发布迁移。
php artisan vendor:publish --provider="Mpociot\Versionable\Providers\ServiceProvider" --tag="migrations"
然后自定义并运行它们。
php artisan migrate
使用
让想要设置在版本控制下的模型使用 VersionableTrait
。
class Content extends Model { use Mpociot\Versionable\VersionableTrait; }
就是这样!
每次更新模型时,都会在数据库中存储一个包含先前属性的新版本。
所有时间戳和可选的软删除时间戳都将被忽略。
从版本控制中排除属性
有时您不希望在模型上的属性每次更改时都创建一个版本。例如,您的 User 模型可能有一个 last_login_at
属性。我非常确信您不想每次用户登录时都为用户模型创建新版本。
要从版本控制中排除特定属性,请在您的模型中添加一个名为 dontVersionFields
的新数组属性。
class User extends Model { use Mpociot\Versionable\VersionableTrait; /** * @var array */ protected $dontVersionFields = [ 'last_login_at' ]; }
隐藏字段
有时您可能希望将隐藏字段包含在版本数据中。您可能已经在模型中将这些字段通过 visible
或 hidden
属性隐藏了。
您可以通过将它们添加到版本化模型的 versionedHiddenFields
属性中,将这些通常在项目中隐藏的字段保存在版本数据中。
class User { use VersionableTrait; // Typically hidden fields protected $hidden = ['email', 'password']; // Save these hidden fields protected $versionedHiddenFields = ['email', 'password']; }
存储版本的最大数量
您可以通过设置版本化模型上的 $keepOldVersions
属性来控制每个模型存储的最大版本数量。默认情况下,没有限制,所有版本都将保存。根据您的应用程序,这可能会导致很多版本,因此您可能想要限制存储的版本数量。
您可以通过在版本化模型上设置 $keepOldVersions
属性来完成此操作
class User { use VersionableTrait; // Keep the last 10 versions. protected $keepOldVersions = 10; }
检索与模型关联的所有版本
要检索所有存储的版本,请使用模型上的 versions
属性。
该属性也可以像其他Laravel关系一样访问,因为它是一个MorphMany
关系。
$model->versions;
获取两个版本之间的差异
如果您想知道两个版本之间具体有哪些变化,请使用版本模型的diff
方法。
diff
方法接受一个版本模型作为参数。这定义了要比较的版本。如果没有提供版本,它将使用当前版本。
/** * Create a diff against the current version */ $diff = $page->previousVersion()->diff(); /** * Create a diff against a specific version */ $diff = $page->currentVersion()->diff( $version );
结果将是一个关联数组,包含属性名作为键,不同的属性值。
回滚到上一个版本
保存版本非常酷,但真正的好处是能够回滚到特定版本。
有多种方法可以实现这一点。
回滚到上一个版本
您可以使用以下方法轻松回滚到当前活动版本之前的版本
$content->previousVersion()->revert();
回滚到特定版本ID
您还可以使用以下方法回滚到模型的具体版本ID
$revertedModel = Version::find( $version_id )->revert();
禁用版本控制
在某些情况下,您可能希望完全禁用特定模型在当前请求中的版本控制。
您可以通过在可版本化模型上使用disableVersioning
和enableVersioning
方法来实现这一点。
$user = User::find(1); $user->disableVersioning(); // This will not create a new version entry. $user->update([ 'some_attribute' => 'changed value' ]);
使用不同的版本表
有时我们希望将模型版本存储在不同的表中。默认情况下,版本存储在'Mpociot\Versionable\Version::$table'中定义的'table'表中。
要使用不同的表来存储某些模型的版本,我们需要更改表名。为此,创建一个扩展Mpociot\Versionable\Version的模型,并将