首页 >后端开发 >PHP问题 >phalcon 框架软删除与物理删除解决方案

phalcon 框架软删除与物理删除解决方案

桉梓
桉梓原创
2020-10-13 16:07:11415浏览

在项目开发中,业务的不同则对数据库中数据的操作也是不一样的, 比如有的数据表需要物理删除数据记录, 而有的数据表中的记录需要假删除(软删除), 现在使用的大部分框架都已经实现了对数据的这两种操作. 那么 phalcon 中如何使用呢?

phalcon 中的物理删除 $model->delete();

在 phalcon 中使用 $model->delete();默认执行的是物理删除, 则数据库中的数据记录被删除.

phalcon 中软删除使用

phalcon 中提供了需要多类似钩子的功能, 我理解的钩子跟中间件的功能类似. phalcon 中有个方法是添加行为: 

$this->addBehavior()
use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Behavior\SoftDelete;
class Users extends Model{    
    const DELETED = "D";    
    const NOT_DELETED = "N";   
    public function initialize()
    {
        $this->addBehavior(
        new SoftDelete(
        [
            "field" => "status", // 数据库中的字段
            "value" => Users::DELETED, //修改数据库中status的值为D
        ]
            )
        );
    }
}

如此, 在使用$model->delete() 方法的时候, 数据表中对应的字段修改为 status = 'D' 实现了软删除的功能, 但是这样会有什么问题 ? 思考 ...

这段代码在每一个 model 中, 冗余, 后续优化...那在写的父类里面BaseModel去实现, 所有的 model 继承 BaseModel 都共用, 不错...

以上两点一定要这么做, 优点大家都懂. 那么这样就没有问题了么?

使用 trail 分离代码

根据业务的不同, 数据库中数据的处理也不一样, 有的 model 需要软删除, 而有的 model 需要物理删除. 用下面的方法做:

 namespace xxxx;
 use Phalcon\Mvc\Model\Behavior\SoftDelete;
 if (!trait_exists('ModelSoftDeletes')) {    
     trait ModelSoftDeletes{
         public function delete(){
             $this->addBehavior(
                 new SoftDelete([
                 "field" => "is_deleted", 
                 "value" => self::DELETED
                ])
            );
            return parent::delete();
        }
    }
}

在需要使用软删除的 model 中使用:

class Userodel extend Model {    
    use ModelSoftDeletes;
    ......
}

ModelSoftDeletes 中的 delete方法会覆盖 Model 中的delete 方法, 在调用 $model->delete() 之前给当前的 model添加软删除的实现.

以上是phalcon 框架软删除与物理删除解决方案的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn