数据库查询构造器中使用闭包时,为什么有时候需要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();
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

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

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

4年前 评论

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

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

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