根據數據庫表字段刪除所有相關信息(刪庫)

需求:每當項目上線前,都要測試一番,產品經理自己瞎操作一波後會來找後臺,給我把有關XXX的數據都刪除了,然後你就去操作數據庫,把有關的數據刪除!!

代碼思路如下:

/**
     * @param $field_name /字段名
     * @param $field_value /字段值
     * @throws \think\db\exception\BindParamException
     * @throws \think\exception\PDOException
     */
    public function fieldDel($field_name,$field_value)
    {
        $table = BaseModel::getInstance()->query('show tables');//獲取數據庫所有表
        foreach ($table as $key=>$value){
            //$value['Tables_in_表名']長這個樣子:xyb_xxx_xxx
            $table_name = explode("_",$value['Tables_in_xyb123']);//切割表名爲數組
            $model = '';
            for($i = 1;$i < count($table_name); $i++){//$i=1從1開始,去除表前綴
                $model .= ucfirst($table_name[$i]);//去除前綴的表名
            }
            $table_model = "\\app\\common\\model\\".$model.'Model';//拼接模型的命名空間(注:不能直接用字符串實例模型)
            $table_data = (new $table_model)->getInstance()->find();//實例並查詢(這裏也可以用獲取表字段結構的方式,但個人感覺查詢更方便)
            if(isset($table_data[$field_name])){//如果表存在$field_name字段
                (new $table_model)->getInstance()->where([$field_name=>$field_value])->delete();//刪除
            }
            //如果需要把自己也幹掉的話
            $myself = explode("_",$field_name);
            $myself_table = ucfirst($myself[0]);
            if($model == $myself_table){
                (new $table_model)->getInstance()->where(['id'=>$field_value])->delete();//刪除自己
            }
        }
        $this->displayBySuccess();//結束
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章