最近打算开一个自己的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();
}

改说的都写在注释里了

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

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

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

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

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

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

不出意外我后续还会续上

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

有问题可以留言问

【thinkphp5】【THINKCMG】标签部分开发(一)的更多相关文章

  1. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  2. Struts1基础、使用Struts实现登录、使用Struts HTML标签简化开发

    Struts 1基础 为什么重拾Struts 1 曾经是最主流的MVC框架 市场份额依然很大 很多遗留系统中依旧使用 维护和升级都需要熟悉Struts 1 与Struts 2相比 编码.配置繁琐 侵入 ...

  3. javaweb(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  4. javaweb基础(26)_jsp标签库开发二

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  5. Jsp标签字典开发_基于Spring+Hibernate

    目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. ...

  6. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  7. JSP简单标签标签库开发

    1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...

  8. THINKPHP5 volist标签循环不能设置循环变量为$i

    在thinkphp5的volist标签中不要用$i作为id,举个简单例子 控制器这样写 模板这样写 结果是 这很令人费解啊.然后换一个循环变量看看 循环正常了,看来这个id这里设置循环变量的时候 不能 ...

  9. Blazor Webassembly多标签页开发

    最近准备用Blazor Webassembly做后台开发要用到多标签页,找了半天发现绝大多数都是Blazor Server的多标签没有Webassembly.没办法只能自己想办法造轮子了. 查了许多资 ...

随机推荐

  1. react6 事件传递参数

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  2. 如何优雅的使用vue+vux开发app -03

    如何优雅的使用vue+vux开发app -03 还是一个错误的示范,但是离优雅差的不远了... <!DOCTYPE html> <html> <head> < ...

  3. Excel学习笔记

    ---恢复内容开始--- -----------随学随记----------- 获取当前日期: 获取当前系统时间,包含年月日时分秒: =NOW() 获取当前系统时间,包含年月日: =TODAY() 只 ...

  4. MongoDB修改器的使用2

    1."$inc"的使用 主要用来增加数值,比如网站的访问量,点击量,流量等 db.games.insert({game:"pinball",user:" ...

  5. seajs模块化开发

    seajs是一个起辅助作用的库,所以它可以更方便开发,而它可以解决以下问题: 1.命名问题,就是冲突 2.性能问题,就是只要一个功能,但却使用一个大插件中的一个小功能,所以要手动拆分出这个功能 3.j ...

  6. 纯CSS制作水平垂直居中“十字架”

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. silverlight MouseLeftButtonDown事件总是无法触发

    参考解决办法:http://www.cnblogs.com/tianguook/archive/2011/05/13/2045299.html 在构造函数中首先添加一个事件: public BtnLi ...

  8. KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2796 上一篇我们提到了SSSSS,作为本系列的最后一篇,本文将介绍KlayGE 4.4的Op ...

  9. SQL-基础知识

    SQL Server中的关于时间转换和获取时间的方法 1.获取当前UTC时间 GETUTCDATE()

  10. CSS光标cursor

    前面的话 在浏览器中,光标对于提供交互反馈很有用.通过在不同的场景中改变光标,就能赋予其不同的含义 定义 cursor光标 值: [<uri>,]*[auto | default | po ...