相关文章推荐
不拘小节的紫菜汤  ·  Sql server 关键字 ...·  2 月前    · 
爱旅游的盒饭  ·  编写国际化 Transact-SQL 语句 ...·  1 月前    · 
踏实的墨镜  ·  PostgreSQL:遍历文本数组并执行SQ ...·  3 周前    · 
有胆有识的斑马  ·  REST Clients :: ...·  6 月前    · 
老实的充值卡  ·  C#如何通过同步和异步多线程来读取sqlse ...·  8 月前    · 
灰常酷的杯子  ·  如何调用API获取密钥_生活物联网平台-阿里 ...·  1 年前    · 
烦恼的手电筒  ·  Python ...·  1 年前    · 
旅行中的葡萄  ·  06Python学习笔记——外部文本数据的读 ...·  1 年前    · 
Code  ›  3分钟短文 ! Laravel拼装SQL子查询的最佳实现开发者社区
社区功能 sql数据库 sql语言
https://cloud.tencent.com/developer/article/1672875
个性的跑步机
1 年前
作者头像
程序员小助手
0 篇文章

3分钟短文 ! Laravel拼装SQL子查询的最佳实现

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 程序员小助手 > 正文

3分钟短文 ! Laravel拼装SQL子查询的最佳实现

发布 于 2020-08-03 20:34:50
1.4K 0
举报

学习时间

对于 数据库 DBA可能更习惯从SQL的角度出发,从SQL现有的语言结构和功能上解决问题。比如查询一个product表,要求查询条件中,product_catagory 表的某些字段存在才能才回。

写多了容易无解,直接上SQL:

大家注意那个 IN 子句,其实是一个查询结果集,从另个表返回的。

写SQL真的很伤神,不如用框架自带的orm,操作起来非常人性化,拼装也很简单。那就抛出一个问题,Laravel如何实现上述的子查询?

对Laravel来说,简直不要太简单,你只要在写whereIn的时候,将数组使用闭包返回就可以了。代码像这么写:

Products::whereIn('id', function($query){
    $query->select('paper_type_id')
    ->from(with(new ProductCategory)->getTable())
    ->whereIn('category_id', ['223', '15'])
    ->where('active', 1);
})->get();

注意外层是

Products::whereIn('id', array(...))->get();

然后我们需要定制的 array,用于包裹返回值数据,那么直接用闭包就是。

$query->select('paper_type_id')->from(TABLE_NAME)->whereIn('category_id', ['223', '15'])->where('active', 1);

也是极为寻常的一条语句。注意from就是表名。我们可以使用方法将其返回,注意是字符串类型:

with(new ProductCategory)->getTable()

这一句要求你的 Products 模型内定义了关联模型,上一句不过是获取 product_catagory 这个表名的字符串。

不止一个方法

解决问题的方法永远不止一个,在Laravel中你还可以不像上一节那样,虽然很明确,写的很标准,可是并不是所有开发者都能达到那样的熟练度。

我们说说通用的,一般开发者所能想到的一些方法。比如获取关联表名那一段,改为手动指定表名,指定列名:

DB::table('users')
    ->whereIn('id', function($query)
 
推荐文章
不拘小节的紫菜汤  ·  Sql server 关键字 'User' 附近有语法错误_156:[microsoft][sql server native client 10.0][sql
2 月前
爱旅游的盒饭  ·  编写国际化 Transact-SQL 语句 - SQL Server | Microsoft Learn
1 月前
踏实的墨镜  ·  PostgreSQL:遍历文本数组并执行SQL开发者社区
3 周前
有胆有识的斑马  ·  REST Clients :: Spring Framework
6 月前
老实的充值卡  ·  C#如何通过同步和异步多线程来读取sqlserver数据库表里的内容 - CSDN文库
8 月前
灰常酷的杯子  ·  如何调用API获取密钥_生活物联网平台-阿里云帮助中心
1 年前
烦恼的手电筒  ·  Python pandas库中的isnull()函数_.isnull()_flying bug的博客-CSDN博客
1 年前
旅行中的葡萄  ·  06Python学习笔记——外部文本数据的读取 - 掘金
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号