ThinkPHP 8的多对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客

《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书

使用VS Code开发ThinkPHP项目-CSDN博客

编程与应用开发_夏天又到了的博客-CSDN博客

多对多关联属于比较复杂的关联,需要借助一个中间表实现,在模型中使用belongsToMany定义。在介绍ThinkPHP 8的多对多语法之间,我们先来看一个例子,以加深对多对多关联的理解。

比如我们开发一个博客系统,每篇文章可以关联多个标签,每个标签可以关联多篇文章,涉及的数据表如表8-1~表8-3所示。

如果我们需要查询ThinkPHP教程这篇文章关联了哪些标签,可以用文章ID从文章标签关联表获得标签ID列表[1,2],再从标签表查询[1,2]的标签得到PHP和ThinkPHP。

查询PHP这个标签关联了哪些文章也是类似的,先用标签ID从文章标签关联表获得文章ID列表[1,2],再从文章表查询到两篇文章。

下面是文章标签多对多关联的ThinkPHP 8模型示例。首先根据上面3个表格创建数据表,SQL语句如下:

复制代码
CREATE TABLE `article` (
  `aid` int NOT NULL AUTO_INCREMENT,
  `title` varchar(45) NOT NULL,
  `content` varchar(45) NOT NULL,
  PRIMARY KEY (`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
CREATE TABLE `tag` (
  `tid` int NOT NULL AUTO_INCREMENT,
  `tname` varchar(45) COLLATE utf8mb3_unicode_ci NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
CREATE TABLE `articletag` (
  `aid` int NOT NULL,
  `tid` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;

再使用MySQL Workbench工具,按表8-1~表8-3给出的数据手工填充数据表。接下来就可以编写多对多关联示例代码了。

1. 文章表

文章表示例如下:

复制代码
<?php
namespace app\model;

use think\Model;

class ArticleModel extends Model 
{
    protected $pk = 'aid'; // 一定要声明主键  
    protected $table = 'article';
    // 设置字段信息
    protected $schema = [
        'aid'			=> 'int',
        'title'		=> 'string',
        'content'	=> 'string',
    ];
    
    public function tags()
    {
        return $this->belongsToMany(TagModel::class, ArticleTagModel::class ,foreignKey:'aid',localKey:'aid');
    }
}
2. 标签表

标签表示例如下:

复制代码
<?php
namespace app\model;

use think\Model;

class TagModel extends Model 
{
    protected $pk = 'tid'; // 一定要声明主键 
    protected $table = 'tag';
    // 设置字段信息
    protected $schema = [
        'tid'			=> 'int',
        'tname'	=> 'string',
    ];
    
    public function articles()
    {
        return $this->belongsToMany(ArticleModel::class, ArticleTagModel::class,foreignKey:'tid',localKey:'tid' );
    }
}
3. 文章标签关联表

需要注意的是,中间表模型需要继承think\model\Pivot,而不是使用默认的think\Model,示例如下:

复制代码
<?php
namespace app\model;
//中间表模型需要继承think\model\Pivot
use think\model\Pivot;

class ArticleTagModel extends Pivot 
{    
    protected $table = 'articletag';
    // 设置字段信息
    protected $schema = [
        'aid'	=> 'int',
        'tid'	=> 'int',
    ];
}
4. 关联查询

关联查询示例如下:

复制代码
use think\Model;
use app\model\ArticleModel;
use app\model\TagModel;
 
class Article 
{
    public function many2many()
    {
        $article = ArticleModel::with(['tags'])->find(1);
        //$article = ArticleModel::with(['tags'])->select();
        //print_r(  $article);
        //print_r(  $article->tags  );

        foreach($article->tags as $tag) {
            echo $tag->tname, PHP_EOL;
        }
    }
}

上面3个模型1个控制器完成后,运行服务器,在浏览器中访问http://localthost:8000/article/ many2many,可以关联查询出aid为1的文章,以及其标签有哪些。

相关推荐
ServBay17 小时前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户9623779544820 小时前
CTF 伪协议
php
BingoGo3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack6 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php