Laravel整理的SQL子查询最佳实现方式不止一种

其实简单来说,编程无非就是对数据库进行增删改查。老程序员简直就是增删改查更高级。
可见,这是一门较难的技能,必须深入掌握。今天我们将从更复杂的嵌套查询开始。
学习时间
作为数据库DBA,你可能更习惯从SQL角度出发,从现有的SQL语言结构和函数来解决问题。例如,查询products表时,查询条件中必须存在product_category表的某些字段,查询结果才能返回。
写多了,很容易找到解决办法。直接上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();
然后我们需要一个自定义字段来包装返回值数据,所以直接使用闭包。
$query->select('paper_type_id')->from(TABLE_NAME)->whereIn('category_id', ['223', '15'])->where('active', 1);
也是一个极其常见的说法。请注意,from 是表的名称。我们可以使用一个方法来返回它。请注意,这是一个字符串类型:
with(new ProductCategory)->getTable()
此语句要求您的产品模型定义了相关模型。前面的语句仅用于获取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 语句。比较直观。缺点是它不可重用,而且冗余代码令人讨厌。
写在最后
本文通过对Laravel中SQL命令查询的实现,讲解了Laravel构建SQL查询的自由度,使用起来非常灵活。
对于固定的查询方式或者优化的SQL语句,可以直接发送给Laravel直接运行,提高效率。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。