laravel打印sql语句_3分钟短文 ! Laravel拼装SQL子查询的最佳实现

引言

数据库操作是应用程序不可避免的绝大多数。难怪有些老程序员总是略带自嘲地说,“不就是个 curd 嘛,说的那么高深!”

ba1194aa2aa4a72ec0540becb53505a7.png

的确,往简单了说,编程不过是增删改查数据库。高级程序员,不过是增删改查地高级一些。

可见这是硬功夫,必须深刻掌握。今天,我们就从一个复杂一些的嵌套式查询说起。

学习时间

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

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

9774f19270740bbbc382087c557f9ab2.png

大家注意那个 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)    {        $query->select(DB::raw('paper_type_id as blablabla'))              ->from('product_catagory')              ->whereIn('id', array(...))              ->where('active', 1);    })    ->get();

这样使用 DB::raw,还有 whereRaw 方法,你几乎就是在写原生的SQL语句了。比较直观。缺点是,不能复用,冗余代码多到令人发指。

写在最后

本文通过一个SQL语句查询在Laravel中的实现方式,解释了laravel在拼装SQL查询时的自由度,使用起来非常灵活。

对于固定的查询方式,或者经过优化的SQL语句,你大可直接发送给Laravel直接运行以便提高效率。

Happy coding :-)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值