Yii2Tech ar-softdelete 使用教程
1. 项目介绍
Yii2Tech ar-softdelete 是一个为 Yii2 框架提供的 ActiveRecord 扩展,它实现了软删除功能。软删除意味着记录不会被从数据库中实际删除,而是被标记为不再活跃。这种机制在需要保留记录数据,同时又不想让这些记录在应用中显示时非常有用。
2. 项目快速启动
首先,确保你已经安装了 Yii2 框架。接下来,通过 Composer 安装 ar-softdelete 扩展:
php composer.phar require --prefer-dist yii2tech/ar-softdelete
或者在 composer.json
文件中添加以下内容:
"require": {
"yii2tech/ar-softdelete": "*"
}
然后,在你的模型类中配置 SoftDeleteBehavior
行为:
use yii\db\ActiveRecord;
use yii2tech\ar\softdelete\SoftDeleteBehavior;
class Item extends ActiveRecord
{
public function behaviors()
{
return [
'softDeleteBehavior' => [
'class' => SoftDeleteBehavior::className(),
'softDeleteAttributeValues' => [
'isDeleted' => true
],
],
];
}
}
现在,你可以使用 softDelete()
方法来软删除记录:
$id = 17;
$item = Item::findOne($id);
$item->softDelete();
如果你想恢复删除的记录,可以设置 SoftDeleteBehavior::$useRestoreAttributeValuesAsDefaults
属性为 true
,然后使用 restore()
方法。
如果你想将 delete()
方法的行为改为软删除,可以在行为配置中设置 replaceRegularDelete
为 true
。
public function behaviors()
{
return [
'softDeleteBehavior' => [
'class' => SoftDeleteBehavior::className(),
'softDeleteAttributeValues' => [
'isDeleted' => true
],
'replaceRegularDelete' => true
],
];
}
3. 应用案例和最佳实践
查询软删除的记录
为了只查询被软删除的记录或未被删除的记录,可以在查询时添加相应的条件:
$notDeletedItems = Item::find()->where(['isDeleted' => false])->all();
$deletedItems = Item::find()->where(['isDeleted' => true])->all();
或者,你可以使用 SoftDeleteQueryBehavior
行为来简化查询:
public static function find()
{
$query = parent::find();
$query->attachBehavior('softDelete', SoftDeleteQueryBehavior::className());
return $query;
}
然后使用命名范围:
$deletedItems = Item::find()->deleted()->all();
$notDeletedItems = Item::find()->notDeleted()->all();
在关联查询中使用软删除
在关联查询中,你可以使用 innerJoinWith
方法并结合 notDeleted()
范围来确保只获取活动记录的相关数据:
$comments = Comment::find()
->innerJoinWith(['item' => function ($query) {
$query->notDeleted();
}])
->all();
4. 典型生态项目
由于 ar-softdelete 是 Yii2 的一个扩展,它通常与 Yii2 生态中的其他项目一起使用。例如,你可以与 Yii2 的 RBAC(基于角色的访问控制)模块结合使用,以确保即使记录被软删除,用户的权限仍然得到正确管理。此外,它也可以与 Yii2 的其他 ORM 扩展配合使用,如 yiisoft/yii2-authclient 用于社交登录,或 yiisoft/yii2-imagine 用于图像处理。这些项目的结合可以帮助开发者快速构建功能丰富且安全的应用程序。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考