OK,那Query Builder是如何把书写的api编译成SQL呢?...编译API成SQL 还是以上篇说到的一行简单的fluent api为例: Route::get('/query_builder', function() { // Query Builder...$this; } 只是简单的赋值给$from属性,并返回Builder对象,这样就可以实现fluent api。...Builder对象 return $this; } 从Builder类中where('id', '=', 1)的源码中可看出,重点就是把where()中的变量值按照column...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时见。
Builder也只是在PDO基础上封装的一层API集合,Query Builder提供的Fluent API使得不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优美。...$this; } 只是简单的赋值给$from属性,并返回Builder对象,这样就可以实现fluent api。...Builder对象 return $this; } 从Builder类中where('id', '=', 1)的源码中可看出,重点就是把where()中的变量值按照$column...Builder也只是在PDO基础上封装的一层API集合,Query Builder提供的Fluent API使得不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优美。...$this; } 只是简单的赋值给$from属性,并返回Builder对象,这样就可以实现fluent api。
说明:本文主要学习Laravel Database模块的Query Builder源码。...实际上,Laravel通过Schema Builder来设计数据库,通过Query Builder来CURD数据库。...在看下Query Builder源码之前,先大概探索下illuminate/database package的目录结构。...是核心的组件,也是类最多的文件夹 Events 装载事件类的文件夹 Migrations 实际执行migrate相关命令的类 Query Query Builder的代码主要在这个文件夹,主要的类是Builder...Builder主要在Query文件夹下,以一行简单又经常使用的代码为例来学习下内部实现的原理吧: Route::get('/query_builder', function() { // Query
说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程。...开发环境:Laravel5.3 + PHP7 Builder::toSql() 看下toSql()的源码: public function toSql() { // $this...GrammarsGrammar::compileSelect(Builder query),看下compileSelect(Builder query)的源码: public function...所以这里可看出Query Builder是在PHP PDO的基础上实现的一层封装,使得用更加面向对象的Fluent API来操作数据库,而不需要写一行SQL语句。...那Eloquent ORM又是什么,与Query Builder是什么关系呢?既然有了Query Builder,为何还提供了Eloquent ORM呢?
使用match query , 搜索java spark ,DSL 大致如下 { "match": { "content": "java spark" } } content 被拆分为两个单词...java 和 spark去匹配,所以如上两个doc都能被查询出来。...match query,只能搜索到包含java和spark的document,但是不知道java和spark是不是离的很近....要实现上述两个需求,用match做全文检索,是搞不定的,必须得用proximity match,近似匹配 phrase match:短语匹配 proximity match:近似匹配 ---- 这里我们要学习的是...match phrase query,就是要去将多个term作为一个短语,一起去搜索,只有包含这个短语的doc才会作为结果返回。
如下例 public function index(Request $request, Topic $topic) { $query = $topic->query();...通过laravel第三方扩展包 spatie/laravel-query-builder 官方文档:https://docs.spatie.be/laravel-query-builder/v2/introduction.../ 1.composer 引入 composer require spatie/laravel-query-builder 2.控制器使用 use Spatie\QueryBuilder\QueryBuilder...'title',//模糊搜索title AllowedFilter::exact('category_id'),//精确搜索category_id...'title',//模糊搜索title AllowedFilter::exact('category_id'),//精确搜索category_id
这次打算改造搜索能力,使用的是meilisearch,这是一个新出来的家伙,还不错! ?...前言 Laravel官方已经有scout+meilisearch 的一键扩展包 见:https://packagist.org/packages/laravel/scout 但是,肯定是不支持5.8版本的...,所以需要我们自己写一个基于scout的搜索插件。..., $builder->query, $size, $page); } /** * 返回给定搜索结果的主键 * * @param mixed $results...$this->search($builder, $size, $page); } /** * 返回搜索结果总数 * * @param mixed $results
、数组或者是一个 stdClass 了,已经不是可以持续构造的 Builder 对象了。...直接通过编辑器的跳转功能点击 update() 方法就会跳转到 laravel/framework/src/Illuminate/Database/Query/Builder.php 的 update(...这个就要一步一步来看了,前面其实我们已经看到了 laravel/framework/src/Illuminate/Database/Query/Builder.php 这个对象的类文件,那么我们是怎么通过...use Illuminate\Database\Query\Builder as QueryBuilder; // laravel/framework/src/Illuminate/Database/...// laravel/framework/src/Illuminate/Database/Query/Builder.php public function from($table, $as = null
主对象是我们的 write 连接对象,而 read 连接对象是它的一个子对象。...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...public function compileInsert(Builder $query, array $values) { // Essentially we will force every...public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) {...有兴趣的同学可以多深入研究一下 Builder 对象中关于上述功能的方法实现。相信经过这一系列的学习,这个文件的内容对你已经不陌生了,也相信你已经可以自己独立的分析剩下的内容了。
不过我搜索了一下自己的星球,发现我的确没有讲过如何调试PHP代码,那么回答一下这个问题也未尝不可。...于是我打开了Github,搜索“PHP”关键字,点进了PHP这个话题。...*/ public function scopeSort(Builder $query, $column, $direction) { if (!...(Builder $query, array $search = []) { if (empty($search)) { return $query;...我尝试debug进入where()函数看了看它内部的实现,src/Illuminate/Database/Query/Builder.php: public function where($column
上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个很重要的部分叫模型关联,它通过面向对象的方式优雅地把数据表之间的关联关系抽象到了...按照Laravel设定好的模式来写关联模型每个人都能写出高效和优雅的代码 (这点我认为适用于所有的Laravel特性)。...', '=', 'role_user.role_id') 然后 addWhereConstraints为其添加的where约束为: //假设User对象的id是1 $query->where('role_user.user_id...[] : $columns; $builder = $this->query->applyScopes(); $models = $builder->addSelect...模型关联常用的一些功能的底层实现到这里梳理完了,Laravel把我们平常用的join, where in 和子查询都隐藏在了底层实现中并且帮我们把相互关联的数据做好了匹配。
laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。 但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。...$builder) { $builder->where('published', '=', 1); }); } 这样SQL语句 where published = 1 就会追加到所有的模型查询方法内...,只要是创建生成了 QueryBuilder 对象的,都会附加上此约束语句。...而声明一个本地作用域,只要遵循laravel的语法规定即可,如下示例: public function scopePublished($query) { return $query->where('published...', 1); } 只需要声明一个以 scope 为首的小驼峰命名的函数方法即可,并返回一个 QueryBuilder 对象实例。
Laravel中软删除数据的过滤也是使用这种方式实现的。...protected function performJoin(Builder $query = null) { $query = $query ?...$query, Builder $parentQuery, $columns = ['*']) { $query->from( $query->getModel()->getTable().' as...以上就是Laravel实现软删除的大概逻辑。这里有一个细节,Laravel中软删除的标记是一个时间格式的字段,默认delete_at。通过是否为null判断数据是否删除。...修改查询条件 3.自定义HasRelationships trait,在自定义的HasRelationships中重写newHasManyThrough方法,实例化自定义的HasManyThrough对象
在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...getConnection() 会返回一个之前讲过的工厂方法创建的 Connection 对象,而 query() 方法则会根据 Connection 创建一个 QueryBuilder 对象。...不过这里需要注意的是,模型默认生成的 QueryBuilder 是 llaravel/framework/src/Illuminate/Database/Eloquent/Builder.php 对象,...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。
Blueprint和Builder,Schema/Builder负责提供数据库操作的面向对象似的操作,而Schema/Blueprint则负责存储具体的操作数据,包括数据库操作的命令和数据库表的定义,因此有下面的结构...和Relation功能,忘记的可以去看前一篇orm 系列 之 Eloquent演化历程1的内容 Query:包含了最基本的Sql的操作和语法逻辑,类似于自定义了一个DSL语言,提供了面向对象的操作方式...本文最后讲下Eloquent中新增的对象之间的关系:多态关系,以下内容摘自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系 表结构 多态关联允许一个模型在单个关联下属于多个不同模型...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this...当项目变复杂后,我们很难简单的和Eloquent的内部的组件进行有效的功能了,这个时候需要一个项目的门面,帮助我们和外界沟通,让外界尽可能简单的使用Eloquent,于是就出现了Manager,记得网上搜索过关键字
的数据操作分两种 – DB facade – Eloquent ORM 它们除了有各自的特色外,基本的数据操作都是通过 Illuminate\Database\Query\Builder 调用方法去完成整个...这个文件在你项目目录中的 vendor/laravel/framework/src/Illuminate/Database/Query 下,你可以自行去查看。...$parameters); } 去调用,这个方法最终以 new Builder() 而告终, public function newEloquentBuilder($query) { return...new Builder($query); } 最后我们到了 Illuminate\Database\Eloquent\Builder 文件下,这个类中涵盖了ORM的基本操作,例如find , findOrFail...如果你在代码用到了get方法,抱歉,这里没有,它依旧会通过__call 方法将你的请求转发到 Illuminate\Database\Query\Builder 类中 $this->query->{$method
代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。第二步,调用模型对象的delete方法。...在laravel中, 这个软删除字段默认是 deleted_at。你也可以在模型中手动指定。...$query->update($columns);} 为了说明问题,我们把中间几行代码都省略了。...Contact extends Model{ public function scopeStatus($query, $status) { return $query-...写在最后 本文从laravel模型的写操作删除动作,讲到了软删除的概念。进而引申出来本地作用域和全局作用域的使用。软删除几乎贯穿了我们应用的始终,需要大家勤学苦练。
\Builder|\App\Post whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Post whereCategoryId...($value) * @method static \Illuminate\Database\Query\Builder|\App\Post whereTitle($value) * @method...Database\Query\Builder|\App\Post whereSummary($value) * @method static \Illuminate\Database\Query\Builder...\Database\Query\Builder|\App\Post wherePublished($value) * @method static \Illuminate\Database\Query...\Builder|\App\Post whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\App\Post
: composer require barryvdh/laravel-debugbar --dev composer require barryvdh/laravel-ide-helper --dev...\Builder|\App\Merchant whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Merchant...\Builder|\App\Product whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Product...\Builder|\App\Product whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\App...\Query\Builder|\App\Shop whereMerchantId($value) * @method static \Illuminate\Database\Query\Builder
领取专属 10元无门槛券
手把手带您无忧上云