Laravel 的数据库查询发生在啥时候?

刚接触Laravel, 有个根本性的疑问一直在困扰我, 一直没搞明白, controller拿到访问请求之后, 啥时候去查询的数据库呢?
例如, 我有一个UserController的控制器, 有个function是show,

public function show(User $user)
{
    return view('users.show', compact('user'));
}

我愚蠢的这么理解: 就一句话, 字面意思看来return了一个view, compact是php的自带方法, 转换成User数组的数据到视图去渲染.
那, 啥时候去查询的数据库?
之所以问这个问题, 是因为, 这个User模型可能有一个一对多的关系, 比如replies, 用户所做的帖子的回复

    public function replies()
    {
        return $this->hasMany(Reply::class);
    }
而在controller里面不做任何事情, 到了View, 
    `@include('topics._reply_list', ['replies' => $topic->replies()->with('user')->get()])`

我的问题是, 难道是在视图渲染的过程中, 才开始去查询关联的一对多关系?这也太神奇了吧? 这要是以后写api是不是就不能这么弄了?
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

实际上,在进入你的控制器代码之前,这个模型实例已经被从数据库内查出来了。

5年前 评论
讨论数量: 10

public function show(User $user) 依赖注入

5年前 评论

你到storage/framework/views下面去看看视图缓存文件就知道了,模板引擎做的事情就是把blade模板文件转成原生的php文件

5年前 评论

@FMW 的回答是不正确的,@安静 的回答没问题,但是很隐晦。这里的实现原理是隐式路由模型绑定,有点类似这个问题:

问答:为什么依赖注入获取的对象为空?

建议你去了解一下 SubstituteBindings 这个中间件,以及这篇 Laravel 文档:

路由《Laravel 5.7 中文文档》

5年前 评论

实际上,在进入你的控制器代码之前,这个模型实例已经被从数据库内查出来了。

5年前 评论

我能不能理解成在路由阶段, 根据传入的id值, 或者其他index值, Laravel就去users库里面搜索并生成了一个User对象了?
所以我们的with关系要写到blade里面去, 这样形成链接之后, 通过链接进入路由的同时, 也就开始了查询, 到controller那儿, 其实已经形成对象了.

5年前 评论

laravel的生命周期那个图片看一下

5年前 评论

@Wi1dcard 我回答的是提问者后面部分的疑问,虽然他可能也还没搞清楚自动注入

5年前 评论

@Marc

我能不能理解成在路由阶段, 根据传入的id值, 或者其他index值, Laravel就去users库里面搜索并生成了一个User对象了?

可以。

5年前 评论

关于你后半部分的问题,Laravel 的确是在视图渲染过程中去查询的数据库,获得关联的模型集合。其实你可以这么理解,Laravel Eloquent 查询和 Controller 代码没有半点关系,Eloquent 是跟数据库有关,Controller 是跟 HTTP 请求生命周期有关,两者没有必然的联系,实际上可以在整个请求处理的任何过程查库。

5年前 评论

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