当前位置:首页 > 后端 > 正文内容

thinkphp6模型中联合主键、中间表调用的写法

Z先生3年前 (2021-12-27)后端692

前言

Thinkphp框架是不错,但是一些特殊用法几乎找不到文档。
模型就新手来说感觉会很麻烦,但是实际上习惯之后会很方便,比如入库和出库的自动格式化,再比如安全的入库。而且模型会让你养成良好的开发习惯,数据库定义后,程序上也再次做对应。

联合主键

默认主键为id,如果你没有使用id作为主键名,需要在模型中通过$this->pk设置属性。

如果是联合主键,设置的时候,将pk设置为数组即可。
单主键:

protected $pk = 'uid';

联合主键:

protected $pk = ['uid','tid'];

无主键:暂时还没有找到资料

中间表

官方文档:模型 - 模型关联 - 关联预载入 中有讲到
with方法也可以支持嵌套预载入,例如:

$list = User::with(['profile.phone'])->select([1,2,3]);
foreach($list as $user){
    // 获取用户关联的phone模型
    dump($user->profile->phone);
}

支持使用数组方式定义嵌套预载入,例如下面的预载入要同时获取用户的Profile关联模型的PhoneJobImg子关联模型数据:

$list = User::with(['profile'=>['phone','job','img']])->select([1,2,3]);
foreach($list as $user){
    // 获取用户关联
    dump($user->profile->phone);
    dump($user->profile->job);
    dump($user->profile->img);
}

示例

表结构

tags

CREATE TABLE `tags`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
  PRIMARY KEY (`id`)
);

news

CREATE TABLE `news`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题',
  `content` varchar(5000) NOT NULL COMMENT '内容',
  PRIMARY KEY (`id`)
);

中间表news_tags

CREATE TABLE `news_tags`  (
  `tag_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'tagid',
  `news_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'newsid',
  PRIMARY KEY (`tag_id`, `news_id`)
);

模型

Tags模型

class Tags extends BaseModel {
    // 表
    protected $name = 'tags';
    protected $pk = 'id';


    // 设置字段信息
    protected $schema = [
        'id' => 'int',
        'name' => 'string',
=    ];
}

News模型

class News extends BaseModel {
    // 表
    protected $name = 'news';
    protected $pk = 'id';


    // 设置字段信息
    protected $schema = [
        'id' => 'int',
        'title' => 'string',
        'content' => 'string'
    ];

    // 模型关联NewsTags 一对多关联 调用采用with('tags.tag')=NewsTags.tag关联
    public function tags() {
        return $this->hasMany(NewsTags::class, 'news_id', 'id');
    }
}

中间表NewsTags模型

class NewsTags extends BaseModel {
    // 表
    protected $name = 'news_tags';
    // 联合主键
    protected $pk = ['news_id', 'tag_id'];


    // 设置字段信息
    protected $schema = [
        'news_id' => 'int',
        'tag_id' => 'int',
    ];

    // 模型关联 一对一属于关联
    public function tag() {
        return $this->belongsTo(Tags::class, 'tag_id', 'id')->bind(['tag_name' => 'name']);
    }

    // 自动时间
    // protected $createTime = 'time1';
    // protected $updateTime = 'time2';

}

调用:

//News模型中的tags关联,tags关联(NewsTags模型)中的tag关联
$model = News::with('tags.tag')->where('id', $id)->find();
print_r($model);

$model->tags 数据如下(如果有的话):

[
    {
        "news_id": 3,
        "tag_id": 1,
        "tag_name": "知识点"
    },
    {
        "news_id": 3,
        "tag_id": 2,
        "tag_name": "测试"
    }
]
分享给朋友:

相关文章

【转】rtsp视频流实现浏览器h5播放

【转】rtsp视频流实现浏览器h5播放

方案思路:获取摄像头数据流 --> FFmpeg转码 --> Node.js(搭建webSocket服务器) --> 在服务器上运行jsmpeg程序操作步骤首先查看是否能够正常地获取...

PHP将图片自动缩放成指定大小:autoCropImage,含nginx伪静态

autoCropImage自己一直在用,并且加入了webp格式转换具体说明和介绍如下:autoCropImage - 图片自动缩放程序将图片自动缩放成指定大小,减少图片体积,从而加快下载速度,降低下载...

困扰了很久的PHP跨域问题

其实这个问题一直是不存在的,只是自己因为各种配置吧,导致了这个问题一直没有解决。现在就解决思路提供如下: 需要两步操作一、修改Nignx配置文件一般在宝塔面板伪静态中设置示例代码: locatio...

Composer常见故障处理

Segmentation fault (core dumped)错误错误详情Composer在自升级和安装包时均报:Segmentation fault (core dumped)错误 检查分析运行...

php之redis乐观锁,秒杀抢购锁库存应用。

直接上代码<?php // 连接Redis $redis = new Redis(); $redis->connect('127.0....

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。