ThinkPHP 远程一对多关联

news2024/10/4 10:22:15

用远程一对多关联的前提

如果模型 A  想远程一对多关联模型 C,前提是中间模型 B 对应的数据库表必须有模型 A 对应的数据表的外键,模型 C 对应的数据库表必须有模型 B 对应数据库表的外键。(套娃)

举例,商品获取商品评论

数据表结构如下

// 商品表
goods
    goods_id - integer // 商品主键
    goods_name - varchar // 商品名称



// 订单商品记录表
order_goods
    order_goods_id - integer  // 订单商品主键
    goods_id - integer // 商品主键
    goods_name varchar // 商品名称



// 订单商品评论表
order_goods_comment
    order_goods_comment_id - integer // 订单商品评论表
    order_goods_id - integer // 订单商品主键
    comment - varchar // 订单商品评论 

订单商品评论表有订单商品记录表的主键,订单商品记录表有商品表的主键,这样,商品就可以远程一对多获取商品的评论。(有点像我们所说的套娃)

远程一对多关联定义

商品表 goods 模型:

<?php

namespace app\api\model;

class Goods extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'goods_id';

    protected $hidden = ['create_time', 'update_time'];


    // 获取商品详情以及商品的评论
    // 第二个参数是所用到的关联方法的方法名
    public static function getDetail($goods_id)
    {
        return self::get($goods_id, 'comments');
    }


    // 远程一对多关联获取商品的所有评论
    public function comments()
    {   
        return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods');
        // 完整写法
        // return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods', 'goods_id', 'order_goods_id', 'goods_id');
    }
}

hasManyThrough 方法的参数如下:

hasManyThrough('关联模型', '中间模型',  '外键1',  '外键2',  '主键');

  • 关联模型(必须):模型名或者模型类名
  • 中间模型(必须):模型名或者模型类名
  • 外键1:当前模型在中间模型的外键,默认的外键名规则是当前模型名+_id
  • 外键2:中间模型在关联模型的外键,默认的外键名规则是中间模型名+_id
  • 主键:当前模型主键,一般会自动获取也可以指定传入

订单商品表(中间表) order_goods 模型

<?php
namespace app\api\model;

class OrderGoods extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_id';
}

订单商品评论表  order_goods_comment 模型

<?php

namespace app\api\model;

class OrderGoodsComment extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_comment_id';
}

实例演示

shop_goods 表

shop_order_goods 表

shop_order_goods_comment 表

演示1

获取 goods_id 为 1 的商品详情以及它的评论

商品 Goods 控制器

<?php

namespace app\api\controller;

use app\api\model\Goods as GoodsModel;

class Goods extends Base
{
    // 获取商品详情以及商品评论
    public function detail()
    {
        $goods_id = 1;

        $detail = GoodsModel::getDetail($goods_id);
        
        halt($detail);

    }
}

商品表 goods 模型

<?php

namespace app\api\model;

class Goods extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'goods_id';

    protected $hidden = ['create_time', 'update_time'];


    public static function getDetail($goods_id)
    {
        // 获取商品详情以及商品评论
        // 第二个参数是所用到的关联方法的方法名
        return self::get($goods_id, 'comments');
    }


    // 远程一对多获取商品的所有评论
    public function comments()
    {   
        return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods');
        // 完整写法
        // return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods', 'goods_id', 'order_goods_id', 'goods_id');
    }
}

订单商品表(中间表) order_goods 模型

<?php
namespace app\api\model;

class OrderGoods extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_id';
}

订单商品评论表  order_goods_comment 模型

<?php

namespace app\api\model;

class OrderGoodsComment extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_comment_id';
}

Goods 控制器  detail 方法输出

array(7) {
  ["goods_id"] => int(10001)
  ["goods_name"] => string(12) "桂味荔枝"
  ["stock_total"] => int(0)
  ["status"] => int(10)
  ["sort"] => int(0)
  ["is_delete"] => int(0)
  ["comments"] => object(think\Collection)#47 (1) {
    ["items":protected] => array(2) {
      [0] => object(app\api\model\OrderGoodsComment)#50 (2) {
        ["data"] => array(6) {
          ["order_goods_comment_id"] => int(1)
          ["order_goods_id"] => int(1)
          ["comment"] => string(24) "桂味荔枝非常好吃"
          ["user_id"] => int(1)
          ["create_time"] => int(1689670979)
          ["update_time"] => int(1689670979)
        }
        ["relation"] => array(0) {
        }
      }
      [1] => object(app\api\model\OrderGoodsComment)#51 (2) {
        ["data"] => array(6) {
          ["order_goods_comment_id"] => int(2)
          ["order_goods_id"] => int(2)
          ["comment"] => string(36) "桂味荔枝很甜,一点都不酸"
          ["user_id"] => int(2)
          ["create_time"] => int(1689732500)
          ["update_time"] => int(1689732500)
        }
        ["relation"] => array(0) {
        }
      }
    }
  }
}

关联方法名 comments 作为键名,关联查询结果集对象 Collection 作为键值。

获取当前商品的评论,访问 comments(关联方法名) 属性即可,如下

<?php

namespace app\api\controller;

use app\api\model\Goods as GoodsModel;

class Goods extends Base
{
    // 获取商品详情以及商品评论
    public function detail()
    {
        $goods_id = 1;

        $detail = GoodsModel::getDetail($goods_id);
        
        halt($detail->comments);

    }
}

输出

object(think\Collection)#47 (1) {
  ["items":protected] => array(2) {
    [0] => object(app\api\model\OrderGoodsComment)#50 (2) {
      ["data"] => array(6) {
        ["order_goods_comment_id"] => int(1)
        ["order_goods_id"] => int(1)
        ["comment"] => string(24) "桂味荔枝非常好吃"
        ["user_id"] => int(1)
        ["create_time"] => int(1689670979)
        ["update_time"] => int(1689670979)
      }
      ["relation"] => array(0) {
      }
    }
    [1] => object(app\api\model\OrderGoodsComment)#51 (2) {
      ["data"] => array(6) {
        ["order_goods_comment_id"] => int(2)
        ["order_goods_id"] => int(2)
        ["comment"] => string(36) "桂味荔枝很甜,一点都不酸"
        ["user_id"] => int(2)
        ["create_time"] => int(1689732500)
        ["update_time"] => int(1689732500)
      }
      ["relation"] => array(0) {
      }
    }
  }
}

演示2

获取所有的商品详情以及它的评论

Goods 控制器

<?php
 
namespace app\api\controller;
 
use app\api\model\Goods as GoodsModel;
 
class Goods extends Base
{
    // 获取所有商品
    public function list()
    {
        $goodsList = GoodsModel::getList();
        halt($goodsList);
    }
}

Goods 模型

<?php

namespace app\api\model;

class Goods extends Base
{

    protected $pk = 'goods_id';

    protected $hidden = ['create_time', 'update_time'];

    public static function getList(array $param)
    {
        // 获取全部商品的详情与评论
        // 第二个参数是所用到的关联方法的方法名
        return self::with('comments')
            ->select();
    }



    // 获取商品的所有评论
    public function comments()
    {   
        return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods');
        // 完整写法
        // return $this->hasManyThrough('OrderGoodsComment', 'OrderGoods', 'goods_id', 'order_goods_id', 'goods_id');
    }
}

订单商品表(中间表) order_goods 模型

<?php
namespace app\api\model;

class OrderGoods extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_id';
}

订单商品评论表  order_goods_comment 模型

<?php

namespace app\api\model;

class OrderGoodsComment extends Base
{
    // 不是默认主键名称记得定义 pk 属性
    protected $pk = 'order_goods_comment_id';
}

Goods 控制器  list 方法输出

object(think\Collection)#43 (1) {
  ["items":protected] => array(1) {
    [0] => object(app\api\model\Goods)#41 (2) {
      ["data"] => array(8) {
        ["goods_id"] => int(10001)
        ["goods_name"] => string(12) "桂味荔枝"
        ["stock_total"] => int(0)
        ["status"] => int(10)
        ["sort"] => int(0)
        ["is_delete"] => int(0)
        ["create_time"] => int(1688696518)
        ["update_time"] => int(1688696518)
      }
      ["relation"] => array(1) {
        ["comments"] => object(think\Collection)#47 (1) {
          ["items":protected] => array(2) {
            [0] => object(app\api\model\OrderGoodsComment)#50 (2) {
              ["data"] => array(6) {
                ["order_goods_comment_id"] => int(1)
                ["order_goods_id"] => int(1)
                ["comment"] => string(24) "桂味荔枝非常好吃"
                ["user_id"] => int(1)
                ["create_time"] => int(1689670979)
                ["update_time"] => int(1689670979)
              }
              ["relation"] => array(0) {
              }
            }
            [1] => object(app\api\model\OrderGoodsComment)#51 (2) {
              ["data"] => array(6) {
                ["order_goods_comment_id"] => int(2)
                ["order_goods_id"] => int(2)
                ["comment"] => string(36) "桂味荔枝很甜,一点都不酸"
                ["user_id"] => int(2)
                ["create_time"] => int(1689732500)
                ["update_time"] => int(1689732500)
              }
              ["relation"] => array(0) {
              }
            }
          }
        }
      }
    }
  }
}

每个商品模型的 relation (关联数组)属性保存着关联模型,关联方法名 comments 作为键名,结果集对象作为键值,结果集对象的 items 属性(数组)保存着关联查询结果。

获取每个商品的分类,访问 comments(关联方法名) 属性即可,如下

<?php
 
namespace app\api\controller;
 
use app\api\model\Goods as GoodsModel;
 
class Goods extends Base
{
    public function list()
    {
        $goodsList = GoodsModel::getList();
        foreach($goodsList as $value){
            dump($value->comments);
        }
 
    }
 
}

Goods 控制器 list 方法输出

object(think\Collection)#47 (1) {
  ["items":protected] => array(2) {
    [0] => object(app\api\model\OrderGoodsComment)#50 (2) {
      ["data"] => array(6) {
        ["order_goods_comment_id"] => int(1)
        ["order_goods_id"] => int(1)
        ["comment"] => string(24) "桂味荔枝非常好吃"
        ["user_id"] => int(1)
        ["create_time"] => int(1689670979)
        ["update_time"] => int(1689670979)
      }
      ["relation"] => array(0) {
      }
    }
    [1] => object(app\api\model\OrderGoodsComment)#51 (2) {
      ["data"] => array(6) {
        ["order_goods_comment_id"] => int(2)
        ["order_goods_id"] => int(2)
        ["comment"] => string(36) "桂味荔枝很甜,一点都不酸"
        ["user_id"] => int(2)
        ["create_time"] => int(1689732500)
        ["update_time"] => int(1689732500)
      }
      ["relation"] => array(0) {
      }
    }
  }
}

如果觉得作者写得好,请帮我点个赞,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《世纪桥》期刊简介及投稿邮箱

《世纪桥》期刊简介及投稿邮箱 一、《世纪桥》期刊简介&#xff1a; 《世纪桥》以服务党史研究、总结执政经验、关注改革实践、透析时代热点、展现党员风采、传播先进文化、繁荣学术事业为宗旨&#xff0c;以发展和培养学术新人为已任&#xff0c;倡导学术的当代性、应用性和…

C# WPF编辑时显示图片,运行时不显示图片的解决方案

1、WPF语法 <Image Source"/ObjectName;component/Images/graph.png"/>2、设置图片属性 复制到输出目录设为&#xff1a;始终复制 生成操作设置为&#xff1a;资源

Spring-AOP(面向切面)

Spring-AOP(面向切面) 场景模拟(计算器) 功能接口 public interface Calculator {int add(int i, int j);int minus(int i, int j);int multiply(int i, int j);int div(int i, int j); }实现类 public class CalculateLogImpl implements Calculator {Overridepublic int …

PerfView 洞察那些 C# 代码中的短命线程

一&#xff1a;背景 1. 讲故事 这篇文章源自于分析一些疑难dump的思考而产生的灵感&#xff0c;在dump分析中经常要寻找的一个答案就是如何找到死亡线程的生前都做了一些什么&#xff1f;参考如下输出&#xff1a; 0:001> !t ThreadCount: 22 UnstartedThread: 0 Ba…

浏览器打开新的页面时自动打开控制台

需求 打开浏览器新tab时自动打开控制台&#xff0c;捕捉初次的网络请求 解决 在浏览器图标属性中加入以下代码&#xff0c;再次打开浏览器 --auto-open-devtools-for-tabs

Django实现接口自动化平台(十四)测试用例模块Testcases序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十三&#xff09;接口模块Interfaces序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django…

1000+设计施工模型免费下载,助力设计方案制作和汇报场景搭建!

作为一名工程设计、施工人员&#xff0c;设计方案制作、工程汇报场景搭建的情景再常见不过。日常需要的模型是必不可少的&#xff0c;但最令人头大的问题是如何寻找方案素材。想要表达的信息越多&#xff0c;素材获取就越是苦恼&#xff01; 有没有一款软件能够集方案三维汇报…

边缘计算:连接物理与数字世界的智能桥梁

引言&#xff1a; 边缘计算&#xff08;Edge Computing&#xff09;作为一种分布式计算模型&#xff0c;旨在将数据处理和分析推向网络边缘设备。随着物联网和大数据的快速发展&#xff0c;边缘计算成为了解决数据处理延迟、网络带宽压力和隐私安全等问题的重要技术。本文将深入…

OLED拼接屏采购指南:如何选择最佳方案?

OLED拼接屏作为一种创新的大屏幕显示设备&#xff0c;正在成为各行各业信息展示和传播的重要工具。 然而&#xff0c;面对市场上众多的品牌和型号&#xff0c;如何选择最佳的OLED拼接屏方案成为一项关键任务。 本文将为您提供一份全面且实用的OLED拼接屏采购指南&#xff0c;…

pdf怎么转换为word格式?这5个实用的方法分享!

在现代数字化时代&#xff0c;PDF&#xff08;Portable Document Format&#xff09;文件已经成为广泛使用的文件格式之一。由于其固定的格式和可移植性&#xff0c;PDF文件在共享和传输文档时非常方便。然而&#xff0c;当我们需要编辑或修改PDF文件时&#xff0c;PDF的固定格…

菜品管理模块开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(五)

文章目录 前言一、文件上传下载1. 文件上传介绍2. 文件下载介绍3. 实现文件上传功能4. 实现文件下载功能5. 上传下载图片效果预览 二、新增菜品1. 需求分析2. 数据模型3. 代码开发4. 功能测试 三、菜品信息分页查询1. 需求分析2. 代码开发3. 功能测试 四、修改菜品1. 需求分析2…

3.JAVA BIO深入剖析

highlight: arduino-light 1.JAVA BIO深入剖析 1.1 Java BIO 基本介绍 Java BIO 就是传统的 java io 编程&#xff0c;其相关的类和接口在 java.ioBIO(blocking I/O) &#xff1a; 同步阻塞&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器…

东莞-戴尔R540服务器故障告警处理方法

DELL PowerEdge R540服务器故障维修案例&#xff1a;&#xff08;看到文章就是缘分&#xff09; 客户名称&#xff1a;东莞市某街道管理中心 故障机型&#xff1a;DELL R540服务器 故障问题&#xff1a;DELL R540服务器无法开机&#xff0c;前面板亮黄灯&#xff0c;工程师通过…

PatchMatchNet运行dtu数据集、

文章目录 1 准备工作2 dtu数据集重建演示2.1 bash文件超参数解释2.2 lists/dtu解释1 准备工作 MVSNet、PatchMatchNet环境配置 数据集下载,准备好数据集,我的dtu数据集放在/PatchmatchNet-main/Data/testData/dtu/下,如图所示 进入mvs 环境:source activate mvs 2 dtu数据…

Appium 安卓环境的配置

目录 前言&#xff1a; 环境准备 写个脚本玩玩 前言&#xff1a; 在使用Appium进行安卓自动化测试之前&#xff0c;需要配置相应的安卓环境。 环境准备 为了避免走弯路&#xff0c;我们先要确保三点&#xff1a; Android SDK API > 17 (Additional features require …

14matlab数理统计 多项式的求根和根据根求多项式(matlab程序)

1.简述 分享一下通过多种不同的方法计算多项式的根。 数值根 使用代换法求根 特定区间内的根 符号根 数值根 roots 函数用于计算系数向量表示的单变量多项式的根。 例如&#xff0c;创建一个向量以表示多项式 x2−x−6&#xff0c;然后计算多项式的根。 p [1 -1 -6]; r …

利用Python和Selenium编程,实现定时自动检索特定网页,发现特定网页内容发生变化后,向管理员发送提醒邮件(一)

一、项目需求 要求爬取某单位网站&#xff0c;登录后台查看是否有新增“网友提问”&#xff0c;如果有新的提问&#xff0c;向特定邮箱发出提醒邮件。 二、项目分析 &#xff08;一&#xff09;判断是否可用爬虫爬取相关内容 首先查看该网站的robots.txt文件&#xff0c;发现…

SpringCloud(四)Hystrix服务降级、熔断、监控页面

一、服务熔断 官方文档&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients 我们知道&#xff0c;微服务之间是可以进行相互调用的&#xff0c;那么如果出现了…

YUM报错:Could not retrieve mirrorlist

​​​​​​背景说明 ESXI新安装CentOS7&#xff0c;无法执行yum命令 报错内容解决方案 1.报错说明&#xff1a;问题在于yum无法获取CentOS的软件仓库地址&#xff0c;导致无法找到合法的baseurl2.检查网络连接&#xff1a;确保服务器可以访问互联网&#xff0c;以及能够解析D…

C++ CEF库 源码编译及使用(VS2019)

源码编译 官网下载源码 CEF Automated Builds