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

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

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();
}

 嵌套关联

/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表中建立关联

TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)的更多相关文章

  1. <记录>TP5 关联模型使用(嵌套关联、动态排序以及隐藏字段)

    在数据库设计中,常常会有如下这种关联模型,分类表中一条分类对应多个商品表中的商品 如果要获得分类表中每条分类 以及 对应的商品的信息,则需要先查询分类表中的数据,然后根据结果遍历查询商品表,最后把数据 ...

  2. 说说CakePHP的关联模型之一 基本关联

    一个无论多么复杂的程序,拆开看无非是三种逻辑结构的组合:顺序结构.条件结构和循环结构. 类似的,数据库中表与表的之间的关联无外乎四种:一对一.一对多.多对一和多对多. CakePHP的模型层中定义了四 ...

  3. ThinkPHP第十五天(setField、setInc、setDec、关联模型)

    1.ThinkPHP中的比较特殊连贯操作 如果要更新某个字段可以用setField方法,比如M('user')->where('id=1')->setField('username','T ...

  4. ThinkPHP第十四天(显示TRACE界面配置,关联模型详解定义)

    1.显示TRACE界面,首选需要在显示模版界面,$this->display(),然后需要在配置文件中配置 SHOW_PAGE_TRACE => true 2.关联模型使用 主表以user ...

  5. ThinkPHP 关联模型(二十)

    原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和  user  关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表 ...

  6. Thinkphp 关联模型

    1.定义关联模型 2.使用关联模型 D('BlogRelation')->relation(true)->add($data);

  7. 关联模型中如果condition条件

    在练习中,有一个user表和地址表,一对多的关系. 我的想法是,通过这个关联模型找出这个用户下面默认值字段为1的地址 控制器中 public function index(){ $User = D(' ...

  8. 实例讲解TP5中关联模型

    https://blog.csdn.net/github_37512301/article/details/75675054 一.关联模型在关系型数据库中,表之间有一对一.一对多.多对多的关系.在 T ...

  9. TP5一对一、一对多关联模型的使用

    文章表SQL CREATE TABLE `tp_article` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `title` varc ...

随机推荐

  1. mysql用户创建与授权

    一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...

  2. MyBatis实战之配置

    MyBatis最重要的配置也就两个,一个是mybatis-config.xml,又称MyBatis的全局配置,另一个就是XXXDao.xml或XXXMapper.xml映射配置. mybatis-co ...

  3. linux服务器关闭ipv6 方法

    第一个文件: /etc/sysconfig/network 第二个文件:如无此文件,vim添加 /etc/modprobe.d/disable_ipv6.conf

  4. 使用java实现hex和ascii码的转换

    几乎很少写JAVA代码,第一是确实不会,第二感觉JAVA写起来不爽(较python.golang),但总有万不得已必须要用java的时候.这里记录下使用java实现的hex十六进制和acsii码之间的 ...

  5. 添加静态路由 route add -host 子网掩码 -- 在线解析

    1.215        -----       R(172.16.0.1)      <--------- gw(61.146.164.109) |                       ...

  6. cocos2d-x 2.2.3 建工程

    2.2以后不再使用模板安装了. 打开终端,进入cocos2d-x目录下的tools/project-creator,执行命令 ./create_project.py -project [项目名] -p ...

  7. 避免代码merge后无法构建发布(GItlabCI + Jenkins)

    1.准备工作 目标: 开发人员提交代码后触发GitlabCI ,如果有merge请求则触发Jenkins对源分支在开发环境构建测试. 2.GItlab配置 开启仅允许pipeline成功后才能merg ...

  8. 【本地服务器】windows下nginx安装操作教程

    1.下载nginx 下载地址:    (可选择下载 Stable version 版本) 2.把安装放到C盘或其他盘的根目录,并解压文件压缩包,可以重命名解压的文件夹,方便找到路径 (注意不要直接双击 ...

  9. android studio更新gradle失败的解决办法-转

    android studio中每次自动更新gradle时速度实在太慢因为gradle服务器比较慢,所以更新gradle会比较慢,建议先下载下来,然后手动添加到gradle的下载目录,提升速度. 使用下 ...

  10. 20155325 Exp9 Web安全基础

    本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验后回答问题 (1)SQL注入攻击原理,如何防御 原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击 ...