使用 ThinkPHP 框架来操作 Typecho 数据库

陈学虎 2021 年 12 月 08 日21:56:12脚本开发7457字阅读24分51秒阅读模式
摘要

在处理比较多的数据的时候,我还是习惯用ThinkPHP轻量级的框架来做,现在有需求,系统是使用的Typecho搭建,现在要经常性的根据接口内容,来更新文章数据,因此便用 ThinkPHP 框架来实现。

在处理比较多的数据的时候,我还是习惯用ThinkPHP轻量级的框架来做,现在有需求,系统是使用的Typecho搭建,现在要经常性的根据接口内容,来更新文章数据,因此便用 ThinkPHP 框架来实现。

使用 ThinkPHP 框架来操作 Typecho 数据库

1、ThinkPHP 新建数据库模型,因为我们主要只是针对文章进行新增、更新操作,所以我们需要建立三个模型,Metas,Relationships,Contents :

<?php
namespace app\model;

use think\Model;

class Metas extends Model
{
    protected $name = "typecho_metas";
}
<?php
namespace app\model;

use think\Model;

class Relationships extends Model
{
    protected $name = "typecho_relationships";
}
<?php
namespace app\model;

use think\Model;

class Contents extends Model
{
    protected $name = "typecho_contents";
}

2、我们主要使用命令行来执行数据的更新,用定时任务执行,因此我们直接建立自定义命令即可,在app\command下建立,基本格式:

<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use app\model\Contents;
use app\model\Metas;
use app\model\Relationships;
use Overtrue\Pinyin\Pinyin;



class Shopinsert extends Command
{


    protected function configure()
    {
        // 指令配置
        $this->setName('shopinsert')
            ->setDescription('导入数据');
    }

    protected function execute(Input $input, Output $output)
    {
        $this->insertData($title,$text,$slug);
        $output->writeln("done ...");
    }

    private function insertData($title,$text,$slug)
    {
        $insertDataModel = new Contents();
        $insertDataModel->title = $title;
        $insertDataModel->slug = $this->checkPostSlug($slug);
        echo $this->checkPostSlug($slug);
        $insertDataModel->created = time();
        $insertDataModel->modified = time();
        $insertDataModel->text = $text;
        $insertDataModel->order=0;
        $insertDataModel->authorId=1;
        // $insertDataModel->template="";
        $insertDataModel->type="post";
        $insertDataModel->status="publish";
        // $insertDataModel->password="";
        // $insertDataModel->commentsNum="";
        $insertDataModel->allowComment=1;
        $insertDataModel->allowPing=1;
        $insertDataModel->allowFeed=1;
        $insertDataModel->parent=0;

        $insertDataModel->save();

        // 绑定分类,这里就直接指定了,因为没有其他类别的需求

        $metaName = "默认分类";

        $insertMetaRelation = new Relationships();
        $insertMetaRelation->cid = $insertDataModel->id;
        $insertMetaRelation->mid = $this->getCategoryIdByName($metaName);
        $insertMetaRelation->save();

        // 处理标签,没有就新增
        $tagName = [$title,$metaName];

        foreach($tagName as $tagUse)
        {
            $insertTagRelation = new Relationships();
            $insertTagRelation->cid = $insertDataModel->id;
            $insertTagRelation->mid = $this->getTagIdByName($tagUse);
            $insertTagRelation->save();
        }
        

    }

    //获取标签 ID
    protected function getTagIdByName($name)
    {
        $metainfo = Metas::where(["name"=>$name,"type"=>"tag"])->find();
        if($metainfo)
        {
            $metainfo->count += 1;
            $metainfo->save();
            return $metainfo->mid;
        }else{
            return $this->insertTag($name);
        }
    }

    // 检测文章 slug 是否存在,存在则增加表示
    protected function checkPostSlug($slug)
    {
    	$insertDataModel = Contents::where(["slug"=>$slug])->count();
    	if($insertDataModel >0)
    	{
    		return $slug.'-'.time().'-'.mt_rand(10000,99999);
    	}else{
    		return $slug;
    	}
    }

    //新增标签
    protected function insertTag($name)
    {
        $metainfo = new Metas();
        $pinyin = new Pinyin();
        $metainfo->name = $name;
        $metainfo->slug = $pinyin->permalink($name);
        $metainfo->count = 1;
        $metainfo->type = "tag";
        $metainfo->description = $name;
        if($metainfo->save())
        {
            return $metainfo->id;
        }else{
            return 0;
        }
    }

    //获取分类 ID
    protected function getCategoryIdByName($name)
    {
        $metainfo = Metas::where(["name"=>$name,"type"=>"category"])->find();
        $metainfo->count += 1;
        $metainfo->save();
        return $metainfo->mid;
    }

}

 

此处为隐藏的内容!
登录后方可查看!

3、在配置中增加命令,在 app\config\console.php中配置:

<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
    // 指令定义
    'commands' => [
        'shopinsert' => 'app\command\Shopinsert',
    ],
];

 

到此,就完成了ThinkPHP操作Typecho数据库,实现内容同步更新了,需要注意的是,Typecho对标签和分类的数量有统计,因此在处理的时候,要特别注意,否则,通过后台操作更新等就会出错。

 

 

 

 

  • 免费优惠券
  • 免费领取优惠券
  • weinxin
  • 品质与测试
  • 关注品质与测试
  • weinxin
  • 版权声明:本文为原创文章,转载请附上原文出处链接及本声明。
  • 转载请注明:使用 ThinkPHP 框架来操作 Typecho 数据库 | https://chenxuehu.com/article/2021/12/7820.html