首页
学习
活动
专区
圈层
工具
发布

Laravel源码解析之QueryBuilder

Connector数据库连接器的闭包外 (就是参数里的 $pdo, 他是一个闭包,具体值在下面和上篇文章中都有提到) 还加载了两个重要的组件 Illuminate\Database\Query\Grammars...接下我们到QueryBuilder类文件 \Illuminate\Database\Query\Builder.php里看看它里面的源码 namespace Illuminate\Database\Query...; } /** * 编译Select查询语句的各个部分 * @param \Illuminate\Database\Query\Builder $query * @return array...、 wheres属性,那么我们见先来看看这三个属性的编译器: /** * 编译Select * 部分的SQL * @param \Illuminate\Database\Query\Builder...通过梳理流程我们知道: Laravel是在第一次执行SQL前去连接数据库的,之所以$pdo一开始是一个闭包因为闭包会保存创建闭包时的上下文里传递给闭包的变量,这样就能延迟加载,在用到连接数据库的时候再去执行这个闭包连上数据库

2.3K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    跟我一起学Laravel-EloquentORM高级部分

    查询作用域 全局作用域 全局作用域允许你对给定模型的所有查询添加约束。使用全局作用域功能可以为模型的所有操作增加约束。...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database...$query) { return $query->where('active', 1); } } 使用上述添加的本地约束查询,只需要在查询中使用scope前缀的方法,去掉...scope前缀即可 $users = App\User::popular()->active()->orderBy('created_at')->get(); 本地作用域方法是可以接受参数的 public...; $user->first_name = 'Sally'; 属性转换 模型的$casts属性提供了一种非常简便的方式转换属性为常见的数据类型,在模型中,使用$casts属性定义一个数组,该数组的key

    1.8K40

    Laravel源码解析之Eloquent Model

    上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。...$this->take(1)->get($columns)->first(); } } //newModelInstance newFromBuilder 定义在\Illuminate\Database...的where方法在接到调用请求后直接把请求转给来Query Builder的 where方法,然后get方法也是先通过Query Builder的 get方法执行查询拿到结果数组后再通过 newFromBuilder...方法把结果数组转换成Model对象构成的集合,而另外一个比较常用的方法 first也是在 get方法的基础上实现的,对query应用limit 1,再从 get方法返回的集合中用 Arr::first(...是在Query Builder的基础上做了进一步封装, Eloquent Builder会把这些CRUD方法的调用转给Query Builder里对应的方法来完成操作,所以在Query Builder里能使用的方法到

    2.8K50

    Laravel5.2之模型关联预加载

    \Database\Query\Builder|\App\Phone whereId($value) * @method static \Illuminate\Database\Query\Builder...\Query\Builder|\App\Product whereShopId($value) * @method static \Illuminate\Database\Query\Builder|...\Query\Builder|\App\Shop whereSite($value) * @method static \Illuminate\Database\Query\Builder|\App\...预加载查询 (1)嵌套预加载 Eloquent在通过属性访问关联数据时是延迟加载的,就是只有该关联数据只有在通过属性访问它时才会被加载。在查找上层模型时可以通过预加载关联数据,避免N+1问题。...发现:只有4个query,耗时3.58ms,效率提高很多。把原来的N+1这种query改造成了where..in..这种query,效率提高不少。可以用EXPLAIN来查看SQL语句的执行计划。

    3.5K41

    Laravel学习记录--Model

    编写全局作用域 1.定义一个类 namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database...\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /**...* 将范围应用于给定的 Eloquent 查询生成器 * * @param \Illuminate\Database\Eloquent\Builder $builder...渴求式加载指定字段 有时候,使用渴求式加载时不需要查询全部字段,这个时候可使用“指定字段” 格式with('模型方法:id,字段1,字段2') 需要注意的是渴求式加载指定字段必须列出父表id 如下例子...} 插入多条数据添加并添加额外字段,通过键值关联对应记录与额外字段 第一个参数 插入的值(数组),第二个参数插入值对应的额外字段(数组) public function show(){

    16.4K20

    Laravel框架关键技术解析

    )即一个没有指定名称的函数,经常用做回调函数(callback)参数的值 2.匿名函数既可以作为参数传递给函数,也可以做为变量赋值,进而控制函数的执行过程;可以从父作用域中继承变量,使用use关键字来继承...二是数据库连接工厂阶段,\Illuminate\Database\Connectors\ConnectionFactory 三是数据库连接器阶段,\Illuminate\Database\Connectors...\Query\Builder)实例封装了数据库连接实例、请求语法实例和结果处理实例,这里类的实例提供了统一的接口方法供查询构造器实例使用 5.查询构造器使用阶段: SQL语句准备阶段,Illuminate...\Database\Query\Grammars SQL语句执行阶段,Illuminate\Database\Connection C.Eloquent ORM 1.两个阶段 Eloquent ORM查询构造器的生成...,Illuminate\Database\Eloquent\Model::newQuery() 操作命令的执行,Illuminate\Database\Eloquent\Builder 2.ORM映射最大的好处是将数据表的结构映射成一个类对象

    15.9K20

    3分钟短文 | Laravel 日志全程记录 SQL 查询语句,要改写底层?

    ,如果query发生,则将传入的SQL语句参数写入日志内。...我们使用全局的 Config 类获取配置信息: Config::get('database.log', false) 如果没有开启数据库日志,则手动处理,将上述 illuminate.query 事件的监听器写入系统内...那么监听事件实现起来是这样的: Event::listen('illuminate.query', function($query, $bindings, $time, $name){}); 好了,既然获取到传入的数据了...为了处理方便,将所有原始数据写入 Log 类方法的第二个传参, 我们将参数打包到数组: $data = compact('bindings', 'time', 'name'); 因为单个SQL语句绑定的参数有很多...,进行格式化;如果是时间戳或者字符串,直接存档。

    2K30

    在 Laravel Eloquent 模型类中使用作用域进行查询

    通过全局作用域类实现 要实现「全局作用域」,首先需要编写一个实现 Illuminate\Database\Eloquent\Scope 接口的全局作用域类,这里我们将其命名为 EmailVerifiedAtScope...php namespace App\Scopes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent...\Model; use Illuminate\Database\Eloquent\Scope; class EmailVerifiedAtScope implements Scope { public...,比如我要在文章中查询指定类型的文章,可以通过在 Post 模型类中定义如下方法: public function scopeOfType(Builder $query, $type) { return...$query->where('type', $type); } 这样,在查询指定类型的文章时,就可以这么实现: $posts = Post::active()->ofType(Post::Article

    3.6K20

    【laravel7.x中文文档】Redis

    Redis 简介 Redis 是一个开源的,高级键值对存储数据库。由于它包含 字符串,哈希,列表,集合,和 有序集合 这些数据类型,所以它通常被称为数据结构服务器。...' => env('REDIS_CACHE_DB', 1), ], ], 默认的服务器配置应该足以进行开发。...Laravel 使用魔术方法将命令传递给 Redis 服务器,因此只需传递 Redis 命令所需的参数即可: Redis::set('name', 'Taylor'); $values = Redis...::lrange('names', 5, 10); 或者,你也可以使用 command 方法将命令传递给服务器,它接受命令的名称作为其第一个参数,并将值的数组作为其第二个参数: $values = Redis...这个 $channel 名称将作为第二个参数传递给提供的回调 闭包: Redis::psubscribe(['*'], function ($message, $channel) { echo

    2K10
    领券