【thinkphp5】【THINKCMG】标签部分开发(一)

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/52714203 ...
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21158419/article/details/52714203

最近打算开一个自己的CMS后台轮子,框架选择了thinkphp 5 (别问我为什么选择这个框架)然后想边开发边记录一下,方便自己方便他人

进入正题

1.数据库设计

一共三张表

post文章表这个就不贴了(在这里没有使用到)

主要是以下两张


一张是存储标签的tag表,

另一张是关系表用于关联标签与文章


2.代码部分

主要我们使用到了thinkphp5的多对多关联(想详细了解的可以看这里 多对多关联


文章表对应的模型

model/Posts.php

<?php

namespace app\admin\model;

use think\Model;

class Posts extends Model
{
    protected function initialize()
    {
        parent::initialize();
    }
    public function tag()
    {
        return $this->belongsToMany('Tags', 'tag_relationships');
    }
}
主要是tag这个函数通过belangsTomany把文章表与标签和关系表做个关联

因为我们还要做到标签找到相关文章我们还得给标签模型加个关联


标签表对应模型

model/Tags.php

<?php

namespace app\admin\model;

use think\Model;

class Tags extends Model
{
    protected function initialize()
    {
        parent::initialize();
    }
    public function post()
    {
        return $this->belongsToMany('Posts', 'tag_relationships');
    }

}
一样的道理不在叙述


下面开始控制器部分

先写新发表文章的标签部分

controller/Post.php

public function doadd(Request $request)
    {
<span style="white-space:pre">	</span>//文章部分不再贴出,但需要先进行写入然后返回文章uid
        $result = $request->param();
        $re_tags = explode(',', $result['tags']);
        //  标签写入
        for ($i=0; $i <count($re_tags); $i++) {
            $data[]=['name'=>$re_tags[$i]];
        }
        $post = PostAdminModel::get($uid);
        $post->tag()->saveAll($data);
    }
说明

$result //post数组

$uid //文章储存完后返回来的主键uid


因为前端标签插件发送的数据格式是通过逗号分隔,所以我们接收到数据后转换为['key'=>'value'](在代码中name是我标签表中标签名字对应的键值名)方便接下来的操作

接下来就是通过Post模型静态调用get方法(默认输入为主键)

然后通过批量增加关联数据操作把刚才我们组合的标签数组传进来

这样新增就完成了


接下来我们开始写编辑页的标签操作

在这里我们先分析一下我们的标签可能的操作

1.删除标签但不删除标签库中的

2.新增标签但是不存在于标签表中

3.新增标签但是存在于标签表中

4.取出全部标签

    public function edit($uid)
    {
        if (Request::instance()->isPost()) {
            $request = Request::instance();
            $result = $request->param();
            //标签 Start
            $re_tags = $result['tags'];
            $taglist = explode(',',$re_tags);
            $post = PostAdminModel::get($uid);
            foreach($post->tag as $value)
            {
                $orglist[] = $value['name'];
            }
            //删除标签    <pre name="code" class="php">             //文章的关联标签与前端传递过来的标签进行对比(顺序不能错了)如果存在值则进行删除操作
            $dellist=array_diff($orglist,$taglist);
            if($dellist)
            {
                foreach($dellist as $value)
                //删除关联操作
                $tag  = TagsAdminModel::getByName($value);
                $post->tag()->detach($tag);
            }
            //增加标签
             //与之前的比较相反即增加操作
            $addlist=array_diff($taglist,$orglist);
            if($addlist)
            {
                foreach($addlist as $value)
                {
<span style="white-space:pre">		</span>   //标签存在于标签库中则只增加关联,不存在则新增
                    $tagresult= TagsAdminModel::getByName($value);
                    if($tagresult)
                    {
                        $tagid = $tagresult->value('id');
                        $post->tag()->attach($tagid);

                    }else{
                        $post->tag()->save(['name'=>$value]);
                    }
                }
            }
            //标签 End
            }
        }
        //渲染获取文章数据
        //因为我们进行了关联所以可以直接通过查询文章表并获取到标签集
        $request=PostAdminModel::get($uid);
        $tags="";
        for ($i=0; $i <count($request->tag); $i++) {
            $tags .= $request->tag[$i]['name'].',';
        }
        $this->assign('tags', $tags);
        return $this->fetch();
    }


 
 

改说的都写在注释里了


其实关于后台的标签操作还有就是单独对于标签的操作

这个就相对简单了直接操作标签的增加删除修改即可

但是在删除的时候一定要注意先进行关联删除再进行标签的删除


前端显示就是文章本身的标签显示这个也简单

还有就是标签反查文章基本方法我在上面都写了

可以按照需求进行修改即可

不出意外我后续还会续上


写的可能很啰嗦很乱 大家凑活看吧~

有问题可以留言问










目录
相关文章
|
Web App开发 数据安全/隐私保护 网络协议
|
Linux 网络安全 数据安全/隐私保护
Linux 使用ssh密钥认证方式登陆另一台linux服务器
Linux 使用ssh密钥认证方式登陆另一台linux服务器
力扣200:岛屿数量(Java dfs+bfs)
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
249 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
2天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
343 90
|
9天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
825 156
|
2天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
244 156