首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Laravel源码解析之QueryBuilder

提供了一个方便接口来创建及运行数据库查询语句,开发者开发时使用QueryBuilder不需要写一行SQL语句就能操作数据库了,使得书写代码更加面向对象,更加优雅。...我们看一下Connectiontable方法,它返回了一个QueryBuilder实例, 其实例化时候Connection实例、Grammer实例和Processor实例会被作为参数传人QueryBuilder...,将SELECT语句分成来很多单独部分放在了$selectComponents属性里,执行compileSelect时程序会检查QueryBuilder设置了$selectComponents里哪些属性...通过梳理流程我们知道: Laravel第一次执行SQL前去连接数据库,之所以$pdo一开始是一个闭包因为闭包会保存创建闭包时上下文里传递给闭包变量,这样就能延迟加载,在用到连接数据库时候再去执行这个闭包连上数据库...程序判断SQL是否执行成功最准确方法是通过捕获 QueryException异常 Processor后置处理结果集 processor是用来对SQL执行结果进行后置处理,默认processor

1.9K50

Laravel源码解析之Database

我们学习和使用一个开发框架时,无论使用什么框架,如何连接数据库、对数据库进行增删改查都是学习重点,Laravel我们可以通过两种方式与数据库进行交互: DB, DB是与PHP底层 PDO直接进行交互...,通过查询构建器提供了一个方便接口来创建及运行数据库查询语句。...EloquentModel, Eloquent是建立 DB查询构建器基础之上,对数据库进行了抽象 ORM,功能十分丰富让我们可以避免写复杂SQL语句,并用优雅方式解决了数据表之间关联关系。...上面说两个部分都包括了 Illuminate/Database包里面,除了作为Laravel数据库层 Illuminate/Database还是一个PHP数据库工具集, 在任何项目里你都可以通过...接下来根据配置文件是否设置了读写分离。

1.3K30
您找到你想要的搜索结果了吗?
是的
没有找到

3分钟短文:Laravel模型作用域,为你“节省”更多代码

全局作用域 假设有些数据库查询操作,无论是控制器内,或者模板文件内,或者命令行方法内,都有重复使用需求,要是模型内有一个公用方法,默认就加上这些筛选条件,就可以显著减少代码量了。...events WHERE `published` = 1; 如果条件 published = 1 默认情况下需要开启,我们可以使用laravel模型 全局作用域 方式为所有查询追加上这个条件。...不过就是QueryBuilder一个属性数组一个元素而已,手动移除就行了,这样特例问题就解决了。...', 1); } 只需要声明一个以 scope 为首小驼峰命名函数方法即可,并返回一个 QueryBuilder 对象实例。...讲述了两个方法: 全局作用域:全局起作用,需要手动移除; 本地作用域:只有手动调用起作用,可链式使用; 这样设计模式可以很大程度上节约查询代码,但是对于维护,需要同等熟悉开发者彼此遵循开发规范,写出可维护代码

1.4K22

Laravel系列4.4】模型Eloquent ORM使用(二)

集合操作 其实这个集合操作并不是模型特有的,还记得 查询构造器 ,我们查询列表时候,总会在最后加一个 toArray() 吗?...比如说我们可以使用类似于 array_map() 函数把集合对象全部转换成数组,还可以用一个类似于 array_column() 函数只获取数据两个字段组成键值对形式数据。...而另外一个 map() 函数就不用多说了,之前我们说过,Laravel PDO 默认查询构造器情况下,走是 PDO::FETCH_OBJ ,获得集合结果每个数据都是一个 stdClass...这是一个连续递进关系,之前 查询构造器 文章,我们已经看到了它底层就是调用 原生查询 操作。那么这回,我们再来看一下 Model 方法,底层是不是调用查询构造器 。...别急,get() 、find() 都是 查询构造器 方法嘛。我们来看看 Model __call() 这个方法。

2.8K20

ElasticSearch权威指南:深入搜索(上)

首先我们需要在倒排索引中找到相关记录并获取文档 ID,然后再扫描 倒排索引每行记录 ,查看它们是否包含其他 terms 。 可以想象,这样不仅低效,而且代价高昂。...独立过滤器缓存 属于一个查询组件 bitsets 是独立于它所属搜索请求其他部分。这就意味着,一旦被缓存,一个查询可以被用作多个搜索请求。bitsets 并不依赖于它所存在查询上下文。...不仅如此,尽管很多过滤器都很容易被评价,但本质上是慢于缓存(以及从缓存复用)。缓存这些过滤器意义不大,因为可以简单地再次执行过滤器检查一个倒排是非常快,然后绝大多数查询组件却很少使用它。...这些选项已被弃用,如果存在,将被忽略过滤器上下文中使用查询子句现在可以自动缓存。该算法考虑到使用频率,查询执行成本以及构建过滤器成本。...过滤器做二元判断:文档是否应该出现在结果?但查询更精妙,它除了决定一个文档是否应该被包括结果,还会计算文档 相关程度 。

4K31

Api 开发之include机制

概述 include英译:包含,包括,使成为...一部分 我们进行API开发时可能会将数据以及与该数据相关数据全部发送给客户端,如 文章数据,相关数据有“用户”,“分类”......可以看到,除了返回文章相关数据外,还返回了用户相关数据 这样做不太友好,因为我们不知道客户端是否需要某些数据,如这里“用户”。...没必要数据增加了数据库操作,增加了数据响应。 正确做法应该是,服务端返回基础数据,根据客户端传参返回其相关联数据 如何实现?.../ 1.composer 引入 composer require spatie/laravel-query-builder 2.控制器使用 use Spatie\QueryBuilder\QueryBuilder...::exact('category_id'):表示精确过滤字段 我们还可以键入某个scope(查询作用域)对数据进一步过滤,本文使用了定义好withOrder作用域 //调用排序函数 public

1.3K10

基于 Redis 布隆过滤器实现海量数据去重及其 PHP 爬虫系统应用

有人可能觉得,可以通过关系数据库字段值来实现类似的过滤功能,确实是一种解决方案,但是对于高并发请求海量数据,数据库能否抗住这种查询压力是一个问题,即使引入了缓存,和 SET 一样,也需要大量存储空间...向布隆过滤器查询指定键名是否存在时,和 bf.add 一样,也会把哈希后索引位置都算出来,看看位数组这几个索引位是否都为 1,只要有一个位为 0,则说明布隆过滤器这个键名不存在。...布隆过滤器爬虫系统应用 通过上面的分析,我们可以得出这个结论:布隆过滤器判断不存在元素一定不存在,而布隆过滤器判断存在元素则不一定存在(概率很低,误差默认小于 1%)。...这种情况下,需要爬取肯定都是没有爬取过链接(布隆过滤器说不存在就一定不存在),没爬取则可能会存在少量未爬取链接被忽略(布隆过滤器存在,则可能不存在),不过这个比例很低,你也可以通过 bf.reverse...你可以队列任务处理完成后,比对 crawl_soources 唯一 URL 总数和已爬取 URL 总数来看看误差是多少,我这里这个两个数值分别是 9417/9327,误差率 1%,和默认值相符,

1.9K11

ElasticSearch客户端调用

,我们也会创建type及其映射关系,但是这些操作建议使用java客户端完成,原因如下: 索引库和映射往往是初始化时完成,不需要频繁操作,不如提前配置好 官方提供创建索引库及映射API非常繁琐,需要通过字符串拼接...,仅仅是利用QueryBuilders构建查询对象不同而已,其他代码基本一致。...其主要目标是使得对数据访问变得方便快捷。 Spring Data可以极大简化数据操作写法,可以几乎不用写实现情况下,实现对数据访问和操作。...默认提供了根据id查询查询所有两个功能: 根据id查询 调用goods仓库根据id查询 判断返回Optional对象是否有值 从Optional对象获取查询结果 @Test public void...//2.判断返回Optional对象是否有值 if (optional.isPresent()) {//有值 //3.从Optional对象获取查询结果

3.3K10

Laravel Eloquent ORM 实现查询表中指定字段

使用Laravel ORMModel方法find, get, first方法获取数据对象时返回数据对象attributes属性数组里会包含数据表中所有的字段对应键值关系, 那么如何在ORM查询时只返回数据表中指定字段数据呢...由于ORM依赖了QueryBuilder来实现查询QueryBuilder源码里通过查看get,first方法实现可以到,他们都可以接收一个数组参数来指定要查询字段: find方法实现是...\Illuminate\Database\Query\Builder,first和get方法源码Query Builder里如下: /** * Execute the query and get...ORM方法查询返回指定字段可通过如下三种方法来实现 $data = ModelA::find($id, ['column1', 'column2']); $data = ModelA::first...以上这篇Laravel Eloquent ORM 实现查询表中指定字段就是小编分享给大家全部内容了,希望能给大家一个参考。

3.1K21

Laravel系列4.2】查询构造器

当然,要使用哪种一般会是团队选择,而且往往更多情况下查询构造器 和 模型 两个结合起来使用。 好了,话说回来,我们还是看看代码。...大家可以看到,代码我还使用了一个 toArray() 结尾,这样返回就是一个数组。如果在没有做其它设置情况下,这个数组里每一项会是一个 stdClass 对象。... Laravel ,默认情况下这个值设置就是 PDO::FETCH_OBJ 。关于如何修改成 PDO::FETCH_ASSOC ,我们会在后面的文章中学习。...我们又发现了一个设计模式 Laravel 框架应用,意外不意外,惊喜惊喜! 连表查询 普通连表查询使用还是非常简单,我也就不多说了,下面的代码也有演示。...一般连表查询,我们只需要一个外键相对应即可,但是实际业务开发,还会有遇到多个键相对应情况,这个才是我们接下来说重点问题。

16.8K10

Android greenDAO 3.2.2简单使用

不会持久化,表示实体类普通字段 @Property 参数 字段 @Unique 唯一约束 @ToOne 一对一,定义到另一个实体对象关系,应在持有目标实体对象字段上使用该注解 @ToMany 一对多...,使用@ToMany属性代表目标实体List,集合里对象都必须至少一个属性指向拥有@ToMany实体 @JoinEntity 多对多,如果两个实体是多对多关系,那么需要第三张表(表示两个实体关系表...limit(int): 限制查询数量 list() 返回一个集合 listLazy() 懒查询 新建一个实体类 @Entity public class OrderDB { @Id(autoincrement...} public void init(Context context) { this.context = context; } /** * 判断是否存在数据库...OrderDB>) mOrderDBHelper.queryOrderDBByQueryBuilderSearch(searchText); 删除所有 mOrderDBHelper.deleteAll(); 其他使用起来大同小异

52710

Laravel源码解析之Eloquent Model

这篇文章我们来学习Laravel Database地另外一个重要部分: Eloquent Model。...Eloquent Model把数据表属性、关联关系等抽象到了每个Model类,所以Model类是对数据表抽象,而Model对象则是对表单条记录抽象。...>where('age', 27)->get(); Model类文件里我们并没有找到 where、 find、 first这些常用查询方法,我们都知道当调用一个存在类方法时PHP会触发魔术方法...属性里各字段字段值找被更改字段(获取Model对象时会把数据表字段会保存在 $attributes和 $original两个属性),如果没有被更改字段那么update到这里就结束了,有更改那么就继续去执行...除了对数据表、基本CRUD抽象外,模型另外一个重要特点是模型关联,它帮助我们优雅解决了数据表间关联关系。我们之后文章再来详细看模型关联部分实现。

2.2K50

3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错!

因为设计灵活度,大家使用Model查询数据集时候,会面临结果为空,记录不存在问题, 那么如何有效地判断查询记录为空呢?本文就带大家深入了解一下。...学习时间 比如有一个请求参数 email,传递邮箱号,现在要在数据库表查找该邮箱对应用户记录。...不存在 } 如果使用聚合查询,通过查询所得条目数,也可以判空。...那么使用邮箱号查询结果,就可以仅取一条,这样我们使用 first 方法,返回一个 User 对象,或者 null, 然后判断 $user 是否是空,如果空,就是没有邮箱不存在;如果有结果,那就是 User...比如更新用户邮箱号,获取用户登陆IP,登陆时间,等等等等其他数据库有的信息。可以避免多次查询。 代码实现起来,大概是这样

81210

3分钟短文:Laravel查询构造器,告别手写SQL艰苦岁月

是有一个从前到后,丝滑连贯感受,上面这段柔顺,它在各个参数位置传入了各种结构数据, 不仅看上去乱,写上去乱,连代码自己都觉得乱。...为了演示查询构造器功能用法,我们直接使用 DB 门面创建 QueryBuilder 对象。...写一条附加任何约束条件查询: $users = DB::table('users')->get(); 还有复杂多表联合查询,使用 INNER JOIN 方式: DB::table('users')...,使用子查询,使用比较绕or查询,我们对or查询两个例子, 大家调试时候,一定要对自己写代码打印一下最终生成SQL语句反复检查和测试,以降低故障。...写在最后 本文轻描淡写地讲解了laravel查询构造器,讲了一个比较复杂OR查询,因为使用闭包组装WHERE约束条件,所以会有些难以理解, 不过对比打印生成SQL语句后,大家应该会豁然开朗!

1.2K10

3分钟短文:Laravel查询构造器,告别手写SQL艰苦岁月

是有一个从前到后,丝滑连贯感受,上面这段柔顺,它在各个参数位置传入了各种结构数据, 不仅看上去乱,写上去乱,连代码自己都觉得乱。...为了演示查询构造器功能用法,我们直接使用 DB 门面创建 QueryBuilder 对象。...写一条附加任何约束条件查询: $users = DB::table('users')->get(); 还有复杂多表联合查询,使用 INNER JOIN 方式: DB::table('users')...,使用子查询,使用比较绕or查询,我们对or查询两个例子, 大家调试时候,一定要对自己写代码打印一下最终生成SQL语句反复检查和测试,以降低故障。...写在最后 本文轻描淡写地讲解了laravel查询构造器,讲了一个比较复杂OR查询,因为使用闭包组装WHERE约束条件,所以会有些难以理解, 不过对比打印生成SQL语句后,大家应该会豁然开朗!

1.7K11

初识 Elasticsearch7.x(二)

其实在实际应用,这个并不必要。相反,当我们分配一个 ID 时,在数据导入时候会检查这个 ID 文档是否存在,如果是已经存在,那么就更新到版本。如果不存在,就创建一个文档。...有时候我们想知道一个文档是否存在,我们可以使用如下方法: HEAD products/_doc/1 其他 _count 我们可以通过使用 _count 命令来查询有多少条数据: GET products...子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。 因为忽略了评分,所以返回所有文档 0 分。 should 至少一个语句要匹配,与 OR 等价,并计算评分。...这两个 term 语句作为兄弟关系,同时处于 must 语句之中,所以返回命中文档要必须都能同时匹配这两个条件。...(highlighting)使你能够从搜索结果一个或多个字段获取突出显示片段,以便向用户显示查询匹配位置。

2.7K20

Laravel源码学习文章汇总

这方面对你收益应该是跳出Laravel框架和PHP语言层面的,当你需要切换到其他框架和语言时这些收益仍会反馈给你。...熟练掌握Laravel使用,虽然很多人说框架只是一个工具不应该花太多时间工具研究上,但是现实时开发者群体大部分人并没有头部那几家大公司,也架构师,我们多数工作还是写业务代码,那么既然你需要...Laravel这个工具帮你完成每天任务,那么为了尽可能高效率高质量完成项目,确实是需要多了去看看框架源码,了解一些框架常用方法positive和negative时行为到底是什么(各种情况下返回值和抛出异常...),知道怎么使用ORM才能让查询更高效等等,这些内容往往框架文档都是很少提及,需要去看源码了解一下,如果你只会文档里提到那些典型用法显然不能算是熟练掌握。...Laravel整个框架设计到内容有很多,其他组件我也就不再一一去写文章梳理了, 相信你认真看完这个系列文章后,假如你使用其他组件过程遇到了诡异问题,或者好奇框架是怎么帮你实现功能

95210

laravel-nestedset:多级无限分类正确姿势

laravel-nestedset是一个关系型数据库遍历树larvel4-5插件包 目录: Nested Sets Model简介 安装要求 安装 开始使用 迁移文件 插入节点 获取节点 删除节点...bar节点没有主键,就是不存在,它将会被创建。 $delete 代表是否删除数据库存在但是$data存在数据,默认为不删除。...但是一些情况下按层级展示是必要,它对获取祖先和用于菜单顺序有用。...helper 方法 检查节点是否其他节点子节点 $bool = $node->isDescendantOf($parent); 检查是否为根节点 $bool = $node->isRoot();...其他检查 other); other); other); $node->isLeaf() 检查一致性 你可以检查是否被破环 $bool = Category::isBroken(); 获取错误统计:

3.4K20
领券