实现要求:
对模型对象以及关联信息,在需要时能方便地做到快速映射,获取,删除。
举例说明:
-- 销售订单(SalesOrder)及其子项(SalesOrderItem),需要在用户下单后,支付后或其他状态改变时进行快照。
步骤:
- 安装 yii2-redis 扩展
<code>composer.phar require --prefer-dist yiisoft/yii2-redis:"~2.0.0"</code>
- 建立快照模型,继承common\models\c2\redis\ActiveRecord, 里面做了定制化primaryKey, 并加入了时间戳等behaviors。
common\models\c2\redis\snapshot\SalesOrder
- 以 [code, s_checkpoint] 为 primaryKey
- 规定了这个快照的属性,包括原实体模型的属性,相关联的标签属性也加入,比如支付方法,支付号,支付状态,收货地址等
- 与common\models\c2\redis\snapshot\SalesOrder\SalesOrderItem建立关系,增删时的关联操作
common\models\c2\redis\snapshot\SalesOrder\SalesOrderItem
- 规定了这个快照的属性,包括原实体模型的属性,相关联的标签属性也加入,比如货品号,货品价格等
- 建立 SnapshotBehavior, 为实体类提供快照方法
- getSnapshotAttributes() - 返回实体类实际映射的属性,快照保存时使用
- takeSnapshot($checkpoint = "") - 根据检查点存储该模型映射的快照
- getSnapshot($checkpoint = "")- 根据检查点获取该模型映射的快照
- deleteSnapshot($checkpoint = "")- 根据检查点删除该模型映射的快照
- 修改实体类 SalesOrder
- public function behaviors() {
return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [
'snapshotBehavior' => [
'class' => \common\behaviors\SnapshotBehavior::class,
'snapshotClass' => \common\models\c2\redis\snapshot\SalesOrder::class,
'primaryKey' => 'code',
],
]);
} - 实现 getSnapshotAttributes() 方法,指定具体属性
测试
$model = \common\models\c2\entity\SalesOrder::findOne(['code' => $code]);
$result = $model->takeSnapshot(SalesOrderStateType::TYPE_PAYED);
$ssModel = $model->getSnapshot(SalesOrderStateType::TYPE_PAYED);
$result = $model->deleteSnapshot(SalesOrderStateType::TYPE_PAYED);