数据库查询构造器中使用闭包时,为什么有时候需要return,有时候又不需要return

在学习文档的时候,看到数据库查询构造器使用闭包的情况下,有时候需要return,有时候又不需要return,请问具体是为什么?

闭包不需要return的情况:

$users = DB::table('users')
           ->where('name', '=', 'John')
           ->where(function ($query) {
               $query->where('votes', '>', 100)
                     ->orWhere('title', '=', 'Admin');
           })
           ->get();

闭包需要return的情况:

$role = $request->input('role');

$users = DB::table('users')
                ->when($role, function ($query, $role) {
                    return $query->where('role_id', $role);
                })
                ->get();
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

你可以跳转过去看看源码,when也是可以不写return的,因为他都是对象传递,可从匿名函数内部改变对象,当你不return回匿名函数的结果时候,默认是返回当前的query对象。当你return回匿名函数的结果时候,结果为真,则when返回匿名函数结果(你在匿名函数里拼个where,其实where方法还是返回的$this),为假则还是返回当前的query对象。

2年前 评论
LiamHao 2年前
13957527310 (楼主) 2年前
13957527310 (楼主) 2年前
讨论数量: 2

翻翻 when 和 where 的源码,看看框架是怎么执行的。

2年前 评论

你可以跳转过去看看源码,when也是可以不写return的,因为他都是对象传递,可从匿名函数内部改变对象,当你不return回匿名函数的结果时候,默认是返回当前的query对象。当你return回匿名函数的结果时候,结果为真,则when返回匿名函数结果(你在匿名函数里拼个where,其实where方法还是返回的$this),为假则还是返回当前的query对象。

2年前 评论
LiamHao 2年前
13957527310 (楼主) 2年前
13957527310 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!