TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)

TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)

在数据库设计中,常常会有如下这种关联模型,分类表中一条分类对应多个商品表中的商品

TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)

如果要获得分类表中每条分类 以及 对应的商品的信息,则需要先查询分类表中的数据,然后根据结果遍历查询商品表,最后把数据拼接在一起

TP5中关联模型可以解决这一问题

普通关联

先创建分类表模型 /application/common/model/Category.php   以及商品表模型 /application/common/model/Goods.php

在分类表中创建关联

namespace app\common\model; class Category extends Base { public function goods(){ return $this->hasMany('Goods','category_id','id'); } }

 

 接着就可以使用关联模型查询数据

    public function list(){ return CategoryModel::with('goods')->where(true)->select(); }

 

 嵌套关联

TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)

 

 /application/common/model/Category.php

class Category extends Model { public function product(){ return $this->hasMany('product','category_id','id'); } }

 

 /application/common/model/Goods.php

class Product extends Model { public function property(){ return $this->hasMany('property','goods_id','id'); } }

 

在控制器中调用:

    public function index() { return Category::with('product,product.property')->where('id',1)->find(); }

 

在调用关联模型查询数据时,如果我们需要动态隐藏字段,或者给记录排序时可以这么做

class Category extends Model { public function product(){ return $this->hasMany('product','category_id','id'); } public function list(){ //在with中可以传递一个闭包函数,函数的参数为当前key锁对应模型的查询器 $this //在闭包函数中无需使用select或者find等返回数据 //如下操作返回 category中所有值,以及对应 product ,并且product按照price排序 return self::with([ 'product'=>function($query){ $query->with('property')->field('name')->order('price'); } ])->select(); } }

 

 

建立原则

1. 哪张表中建立外键那么那张表就是从表  

2. 理论上可以在关联的两张表中建立关联关系,例如用户表User 和用户信息表 Profile 是一对一的关系,假设在Profile表中user_id字段指向User表的id字段,那么在User表中可以建立外键

public function profile(){ return $this->hasOne('profile','user_id','id'); }

 

也可以在Profile表中建立

public function user(){ return $this->belongsTo('user','user_id','id'); }

 

建立原则:在哪张表中调用就在哪张表中建立,例如,通常情况下我们是希望通过查找用户user的同时也输出用户信息,所以我们查找的是user表,所有就在user表中建立关联

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112470.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月7日 上午8:00
下一篇 2021年11月7日 上午9:00


相关推荐

  • 命令模式 Command「建议收藏」

    命令模式 Command「建议收藏」命令模式 Command动机模式定义实例结构要点总结笔记动机在软件构建过程中,“行为请求者”与”行为实现者”通常呈现一种”紧耦合”,但在某些场合—-比如需要对行为进行记录,撤销/重(Undo / Redo),事务”等处理,这种无法抵御变化的紧耦合是不合适的在这种情况下,如何将”行为请求者”和”行为实现这”解耦?将一组行为抽象为对象,可以实现两者之间的松耦合模式定义将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作实例#i

    2022年8月8日
    9
  • JVM成长之路,记录一次内存溢出导致频繁FGC的问题排查及解决「建议收藏」

    JVM成长之路,记录一次内存溢出导致频繁FGC的问题排查及解决「建议收藏」现象:现象截图:内存:命令:jmap-heap30069GC截图:FGC次数19529次!!!何等的恐怖!!!!!命令:jstat-gcutil300691000现象描述:Node模块启动后收到请求却未能响应。一直在频繁的FGC。新生代内

    2022年6月19日
    60
  • UBUNTU 使用简明手册(07年为公司普及LINUX写的简明使用文档)

    UBUNTU 使用简明手册(07年为公司普及LINUX写的简明使用文档)

    2021年5月10日
    219
  • webpack的devtool[通俗易懂]

    webpack的devtool[通俗易懂]这里以环境分类为分析方向1.对开发环境eval-每个模块都使用eval()执行,并且都有//@sourceURL。此选项会非常快地构建。主要缺点是,由于会映射到转换后的代码,而不是映射到原始代码(没有从loader中获取sourcemap),所以不能正确的显示行数。eval-source-map-每个模块使用eval()执行,并且sourcem…

    2022年10月5日
    3
  • 石器时代服务器架设教程_石器时代gm命令

    石器时代服务器架设教程_石器时代gm命令本文只作学习研究之用,任何人不得非法使用。Linux系统架设石器私服概述首要条件,安装Linux版系统,建议CentOS4或者5工具:SSHvncforLinuxandwinxamppforLinux主机在眼前的就不说了,首先说的是如果你租了服务器,机房给你装好系统你自己还需要一些工具再进Linux一般Linux系统用户名默认为root服务商会给你一个初始密码ssh安装在自己w…

    2026年4月14日
    5
  • windows定时关机命令 取消定时关机命令 查看DNS缓存命令 清除DNS缓存命令「建议收藏」

    windows定时关机命令 取消定时关机命令 查看DNS缓存命令 清除DNS缓存命令「建议收藏」shutdown-s-t以秒为单位的时间值注意这里的时间是以秒为单位哦例如:shutdown-s-t3600这是一个钟之后自动关机如果要取消自动关机,则输入:shutdown-a即可。另外再记个我觉得的常用命令吧ipconfig/displaydns这个显示是电脑上的dns缓存的全部信息ipconfig/flushdns这个是清除dns缓存的命令。…

    2022年5月14日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号