ThinkPHP6.0模型关联分页

2019-12-16  本文已影响0人  思议岁月

模型关联分页简单案例,标签关联文章,对文章进行分页,上一篇文章写得比较繁琐,这里可以将问题拆解成一对多关系,那么问题就迎刃而解了。
我们可以通过查询tag直接拿到tag_id,通过中间表和文章表关联一对多实现关联分页,总体代码量会精简许多,而且能达到相同的效果,下面来看看吧!

  1. 文章模型
<?php
namespace app\admin\model;

class News extends Common
{
    protected $autoWriteTimestamp = true;// 开启自动写入时间戳字段

    /*
     * 定义了修改器之后会在下列情况下触发:
     * 模型对象赋值;
     * 调用模型的data方法,并且第二个参数传入true;
     * 调用模型的save方法,并且传入数据;
     * 显式调用模型的setAttr方法;
     * 定义设置文章的描述,若为空直接截取内容前面的文字
     */
    public function setAbstractAttr($abstract, $news)
    {
        $abstract=str_replace(' ','',$abstract);
        if (empty($abstract)){
            return mb_substr(strip_tags(htmlspecialchars_decode($news['content'])), 0, 100, 'utf-8');
        }else{
            return $abstract;
        }
    }

    //
    public function tags()
    {
        return $this->belongsToMany('Tags', '\\app\\admin\\model\\NewsTags', 'tags_id','news_id');
    }
    public function newsCategory()
    {
        return $this->belongsTo('NewsCategory', 'news_category_id', 'id');
    }
    //关联中间表
    public function newsTags()
    {
        return $this->belongsTo(NewsTags::class,'id', 'news_id');
    }
}

中间表模型

<?php
namespace app\admin\model;
use think\model\Pivot;

class NewsTags extends Pivot
{

}
  1. 具体分页代码
    public function index()
    {
        $data=$this->request->param();
        $tag_name=$data['name'];
        $tag=Tags::where('name',$tag_name)->find();
        $news = News::hasWhere('newsTags',array('tags_id'=>$tag->id))->with('newsCategory')->paginate(1);
        return view('index',compact('tag','news'));
    }
分页

实现了和上个版本相同的效果,明显更优。希望对大家有所帮助!

上一篇 下一篇

猜你喜欢

热点阅读