Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-25) 阅读数 52 #后端开发
Laravel拼装SQL子查询最佳实现,还不止一个方法

其实简单来说,编程无非就是对数据库进行增删改查。老程序员简直就是增删改查更高级。

可见,这是一门较难的技能,必须深入掌握。今天我们将从更复杂的嵌套查询开始。

学习时间

作为数据库DBA,你可能更习惯从SQL角度出发,从现有的SQL语言结构和函数来解决问题。例如,查询products表时,查询条件中必须存在product_category表的某些字段,查询结果才能返回。

写多了,很容易找到解决办法。直接上SQL:Laravel拼装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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门