在Laravel开发中,查询构造器的链式调用是非常常用的功能,通常我们会把多个查询条件分成多行来写,方便阅读和维护。但在一些简单查询或者需要精简代码的场景下,我们可以将多行链式调用合并为一行,让代码更加简洁。

基础合并方式:直接拼接链式调用
最直观的合并方式就是把所有链式调用直接拼接在一行中,只要逻辑上没有换行依赖,就可以直接合并。比如我们原本的多行查询代码是这样的:
$users = DB::table('users')
->where('status', 1)
->where('age', '>', 18)
->orderBy('created_at', 'desc')
->get();
合并为一行之后的代码如下:
$users = DB::table('users')->where('status', 1)->where('age', '>', 18)->orderBy('created_at', 'desc')->get();
这种方式适合查询条件较少、逻辑简单的场景,虽然合并成了一行,但依然可以清晰看到每个查询步骤。
复杂场景的合并技巧
使用变量存储中间结果
如果查询逻辑比较复杂,直接合并一行会导致代码过长,可读性下降,这时候可以先把查询构造器实例赋值给变量,再在变量上继续链式调用,最后合并成一行执行。示例如下:
$query = DB::table('orders')->where('user_id', 1);
$query->where('pay_status', 2)->orderBy('id')->get();
如果需要彻底合并成一行,也可以写成:
$orders = (DB::table('orders')->where('user_id', 1))->where('pay_status', 2)->orderBy('id')->get();
封装查询逻辑为方法
当某段查询逻辑会被多次使用时,我们可以把多行链式调用封装成一个自定义方法,调用方法时只需要一行代码即可完成查询。首先在模型或者查询类中定义方法:
// 在User模型中定义方法
public static function getActiveAdultUsers()
{
return self::where('status', 1)
->where('age', '>', 18)
->orderBy('created_at', 'desc')
->get();
}
调用的时候只需要一行代码:
$users = User::getActiveAdultUsers();
合并时的注意事项
- 合并后的一行代码长度不宜过长,如果超过IDE的建议长度,反而会降低可读性,这时候建议拆分或者封装方法。
- 如果查询中包含条件判断,不要强行合并为一行,避免逻辑混乱,比如有
if判断的查询场景,保持多行写法更清晰。 - 合并链式调用不会改变查询的执行逻辑和结果,只是代码形式的调整,性能上没有任何差异。
适用场景总结
以下场景适合将多行查询链式调用合并为一行:
| 场景 | 合并建议 |
|---|---|
| 简单查询,条件少于3个 | 直接拼接合并为一行 |
| 查询逻辑复用性高 | 封装为方法,调用时一行代码 |
| 临时查询,不需要复用 | 合并为一行减少代码行数 |
| 复杂条件带判断逻辑 | 不建议合并,保持多行写法 |