天天看點

【thinkphp5】【THINKCMG】标簽部分開發(一)

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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();
    }           

改說的都寫在注釋裡了

其實關于背景的标簽操作還有就是單獨對于标簽的操作

這個就相對簡單了直接操作标簽的增加删除修改即可

但是在删除的時候一定要注意先進行關聯删除再進行标簽的删除

前端顯示就是文章本身的标簽顯示這個也簡單

還有就是标簽反查文章基本方法我在上面都寫了

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

不出意外我後續還會續上

寫的可能很啰嗦很亂 大家湊活看吧~

有問題可以留言問