3分钟短文 | Laravel获取关联表指定列的3个方法
引言
在数据库表的设计时,对不同的功能进行切分,分割为不同的表进行存储。在业务逻辑中,再将需要连接的数据进行整合输出。
今天我们说一说,在Laravel中,如何关联模型,以及制定返回列,以精简返回数据。
学习时间
假如有两个模型 User 和 Post,一个用户会发布多个post,也就是一对多的关联关系。在User模型中,指定此关系:
public function post(){
return $this->hasmany('Post');
}
反过来,在Post模型中,必然有一个发布者,是一对一的映射:
public function user(){
return $this->belongsTo('User');
}
现在假如有一个查询,获取所有的帖子,并返回发布者的信息。如下:
public function getAllPosts() {
return Post::with('user')->get();
}
这样在返回值中,就可以使用 $post->user 返回 User 模型,并访问其属性和方法。经过框架整合后的 SQL 语句大概是这样的:
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
显然,第二条SQL语句,返回了user表的所有列,数据量有可能很大。是否可以返回指定列呢?这样可以精简输出,减少MySQL的传输负荷。
with语句
模型的with语句用于调用模型内声明的关联关系,其实它接收一个数组,可以在查询时关联多张表,同时支持一个闭包,用于对关联表的查询语句进行裁切。
如上一节要指定user表的列,可以这样写:
Post::with(array('user'=>function($query){
$query->select('id','username');
}))->get();
闭包内$query拼接SQL语句,并指定 select 选取的列,那么框架生成的SQL语句,就只会返回 id,username 列。
关联关系
我们注意到,在关联关系的声明上,第一节仅使用了 belongTo,hasMany 这样的属性,其实还可以链式调用。这样对于所有使用 with 语句关联的模型查询,都会生效。
没错儿,接着关联关系用下去。比如Post模型内:
public function user()
{
return $this->belongsTo('User')->select(array('id', 'username'));
}
特殊性
在Laravel5.5及以上的版本,支持在使用with语句的使用,按照格式书写返回指定列。
Post::with('user:id,username')->get();
低版本可就没有那么好运气了!:-(
写在最后
本文通过2种确切可用的方式,裁剪了关联模型返回列的内容。
在实际代码中,第一种使用闭包修剪SQL语句,用途较为广泛。
第二种方式影响全局,一般不推荐。
第三种则是第一种的变体,但是对版本有要求。
Happy coding :-)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 通过 Serverless Regsitry 快速开发与部署一个 WordCount 实例
- 聊聊dubbo-go的gracefulShutdownFilter
- 强烈推荐:2020年15道优秀的TypeScript练习题 (上集)
- 聊聊dubbo-go的GenericFilter
- Salesforce LWC学习(十九) 针对 lightning-input-field的label值重写
- MySQL定时备份方案
- Nginx多方面调优策略
- 太厉害了!这应该是目前Redis可视化工具最全的横向评测
- pip install时timeout设置
- 聊聊dubbo-go的TpsLimitFilter
- 聊聊dubbo-go的TokenFilter
- 你这磨人的小妖精——选中文本并标注的实现过程
- VUE跨页面传值的精妙
- 一文解决如何提取TCGA配对表达矩阵
- CSS中的伪类选择器、颜色、度量单位、文本字体及文本样式设置