彻底删除thinkphp3.1案例blog标签的方法
作者:shichen2014 发布时间:2023-11-21 12:01:01
标签:删除,thinkphp,标签
本文实例讲述了彻底删除thinkphp3.1案例blog标签的方法。分享给大家供大家参考。具体方法如下:
thinkphp3.1框架中的案例blog,添加日记的同时可以添加标签tag,但仅此而已。当删除日记时,标签并没有被删除掉,从而造成think_tagged表和think_tag累积了垃圾数据。为了实现删除日记的同时也一起清理掉think_tagged表和think_tag那些过时的数据,我写了一个函数,在看下面函数时,要先弄清think_tagged表、think_tag和think_blog表的关联关系。
函数如下:
public function deltag($recordId){
$condition['recordId'] = $recordId;//获取日记的ID
$tagged=M('Tagged');
$taggedlist= $tagged->where($condition)->select();//这里用select而不用find,因为一篇日记可能有多个标签
$taggedids=array();//声明一个数组,用来装think_tagged表的ID
$tagIds=array();//声明一个数组,用来装think_tag表的ID
foreach ($taggedlist as $key => $value) {
$tagIds[]=$value['tagId'];//获取think_tag表的ID
$taggedids[]=$value['id'];//获取think_tagged表的ID
}
//考虑到一篇日记可能有多个标签,所以这里对$tagIds作一下遍历
foreach ($tagIds as $tagIdk => $tagIdv) {
$tagId=$tagIdv;
$tag=D('Tag');
$tagvo=$tag->where('id='.$tagId)->find();//获取每个$tagId对应的一条记录
$count=intval($tagvo['count']);//获取标签的数量
if($count==1){//如果$count==1,说明这个标签仅有这篇日记所有,删掉。
$tag->where('id='.$tagId)->delete();
}elseif($count > 1){//$count > 1,说明这个标签为多篇日记所有,不能删除,所以减1。
$tag->where('id='.$tagId)->setDec('count',1);//setDec使$count减1,注意thinkphp3.1的使用方法。
}
}
//下面是删除日记存在think_tagged表里的相关数据
foreach ($taggedids as $taggedid_k => $taggedid_v) {
$tagged->where('id='.$taggedid_v)->delete();
}
}
函数写好了,怎么使用呢?方法很简单。
我们来看一下删除日记的函数
public function delete() {
//删除指定记录
$model = M("Blog");
if (!empty($model)) {
$id = $_REQUEST[$model->getPk()];
if (isset($id)) {
if ($model->where("id=" . $id)->delete()) {
if ($this->__get('ajax')) {
$this->ajaxReturn($id, L('_DELETE_SUCCESS_'), 1);
} else {
$this->success(L('_DELETE_SUCCESS_'));
}
} else {
$this->error(L('_DELETE_FAIL_'));
}
} else {
$this->error(L('_ERROR_ACTION_'));
}
}
}
这个函数是放在Examples\Blog\Lib\Action\PublicAction.class.php这个公共类里的,BlogAction.class.php类继承了其删除函数,我们就把deltag($recordId)函数放在delete() 里调用,如下:
public function delete() {
//删除指定记录
$model = M("Blog");
if (!empty($model)) {
$id = $_REQUEST[$model->getPk()];
if (isset($id)) {
$recordId=$id;
$this->deltag($recordId);
if ($model->where("id=" . $id)->delete()) {
if ($this->__get('ajax')) {
$this->ajaxReturn($id, L('_DELETE_SUCCESS_'), 1);
} else {
$this->success(L('_DELETE_SUCCESS_'));
}
} else {
$this->error(L('_DELETE_FAIL_'));
}
} else {
$this->error(L('_ERROR_ACTION_'));
}
}
}
以上只适用删除单条日记的情况,当然如要批量删除日记,只要遍历删除blog的ID同时调用一下deltag($recordId)就OK了。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。


猜你喜欢
- Python写入Excel有时需要合并单元格、或者改变文字内容的颜色首先导入xlwt模块import xlwt创建文件名创建Excel工作簿
- 【1】MySQL中的日期时间类型MySQL中常用的几种时间类型有:date、datetime、time、year、timestamp数据类型
- language.xml 代码如下:<?xml version="1.0" encoding=
- 1.基本结构 create OR REPLACE PROCEDURE存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBE
- 安装@vitejs/plugin-vue-jsxyarn add -D @vitejs/plugin-vue-jsxnpm i -D @vi
- 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写,字符串长度小于5
- 工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要。本文以Python里中的实现为例,首先来探讨一下稀疏
- 前几天遇到一个问题,需要把网页中的一部分内容挑出来,于是找到了urllib和HTMLParser两个库.urllib可以将网页爬下来,然后交
- 八九年前,我在公司做设计,当时就已经做到技术总监,Photoshop是自学的,当时觉得全世界比我Photoshop强的人也不在多数。七年前,
- 一、实现过程终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关转义序列是以ESC开头,即用\033来完成(ESC
- 研究了几天Adodb.stream和XMLHTTP的应用,找了不少很有趣的教程,下面的代码是将一个远程的页面,图片地址保存到本地的实例。将代
- 我有一个朋友,一直纠结一个问题:arguments接受的实参是一个列表,得到的是一个像数组一样的东西,于是他想实现无限参数求和,在遍历数组求
- StringIO它主要是用在内存读写str中。主要用法就是:from io import StringIOf = StringIO()f.w
- 表数据导出到一个文本文件最简单的方法是使用SELECT... INTO OUTFILE语句的查询结果直接导出到一个文件在服务器主机上。导出数
- python与C的区别如下:1、语言类型不同。Python是一种动态类型语言,又是强类型语言。它们确定一个变量的类型是在您第一次给它赋值的时
- 引言通常,您可能希望在 Pandas DataFrame 中插入一个新列。幸运的是,使用 pandas insert()函数很容易做到这一点
- 为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时
- 在这个情人节前夕,我把现任对象回收掉了,这段感情积攒了太多的失望,也给了我太多的伤害,所以我看到这个活动的第一反应是拒绝的。然而人生嘛,最重
- 本文实例为大家分享了python批量复制图片到文件夹的具体代码,供大家参考,具体内容如下直接上代码:# -*- coding: utf-8
- 当perl脚本运行时,从命令行上传递给它的参数存储在内建数组@ARGV中,@ARGV是PERL默认用来接收参数的数组,可以有多个参数,$AR