前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文 | Laravel获取关联表指定列的3个方法

3分钟短文 | Laravel获取关联表指定列的3个方法

作者头像
程序员小助手
发布2020-07-29 14:38:33
2K0
发布2020-07-29 14:38:33
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

在数据库表的设计时,对不同的功能进行切分,分割为不同的表进行存储。在业务逻辑中,再将需要连接的数据进行整合输出。

今天我们说一说,在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 :-)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 学习时间
  • with语句
  • 关联关系
  • 特殊性
  • 写在最后
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档