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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BeanUtils的简单使用[通俗易懂]

    BeanUtils的简单使用[通俗易懂]使用BeanUtils的原因因为setProperty是JSP中的标签,因此使用model2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Servlet程序无法像JSP一样使用setProperty对数据进行封装,<jsp:useBeanid="calculator"class="cn.megustas.javabean.Calcula…

    2022年9月11日
    2
  • 3nf和bcnf分解_如何分解成3nf

    3nf和bcnf分解_如何分解成3nf1.3NF分解先求出正则覆盖Fc对于Fc里面的所有函数依赖a->b,均转化为Ri=ab对于所有的模式Ri如果包含候选码,进行第4如果都不包含候选码,将任意一个候选码添加到模式Ri里面如果一个模式被另一个模式包含,则去掉此被包含的模式。例子:…

    2025年7月8日
    2
  • 冒泡排序法_GUI斗地主小游戏源码java

    冒泡排序法_GUI斗地主小游戏源码java看图秒懂代码!

    2025年8月24日
    2
  • win10下pycharm+Qtdesigner+Pyqt 成功配置

    win10下pycharm+Qtdesigner+Pyqt 成功配置请在安装之前,将整个博客看完之后再进行操作!我的安装过程有点曲折//使用Qtdesigner做可视化的界面设计,是一项很强大的工具。今天用到了,就在pycharm下配置一下,随手做点记录Qtdesigner可以可视化拖动生成界面。我的环境:win10pycharm+anaconda(python3.6.4)配置过程:1.在安装pyqt5的时候需要有sip的支持,sip…

    2022年8月25日
    9
  • C++11特性_object.equals

    C++11特性_object.equalsdecltype与auto关键字一样,用于进行编译时类型推导。decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,例如:intx=3;decltype(x)y=x;有人会问,decltype的实用之处在哪里呢,假如有一个加工产品的函数模板:templatevoidproc

    2022年9月9日
    3
  • QT安装具体图解

    QT安装具体图解文章目录QT安装包下载Qt安装QT安装包下载我下载的版本是最新的5.14.2下载链接在下面,https://download.qt.io/archive/qt/5.14/5.14.2/找到Windows版本下载(ps:如果需要下载其他版本的话点击父目录就可以去选择不同版本了,建议5.9以上。)(ps:Linux上的Qt安装日后会更新,见谅)Qt安装1.双击下载好的安装包,出现界面点击next2.根据个人情况选择填写信息,有账号就登陆,没有就注册一个(注意:注册时候的密码需要英文大写,

    2022年5月17日
    48

发表回复

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

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