集合 对 Eloquent 中获取多个结果的方法(比如 all 和 get)而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例,Collection...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent...* * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) {...} } 使用本地作用域 作用域被定义好了之后,就可以在查询模型的时候调用作用域方法,但调用时不需要加上 scope 前缀,你甚至可以同时调用多个作用域,例如: $users = App\User::popular...* * @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate
软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口的类,该接口只有一个方法apply,在该方法中增加查询需要的约束...$model) { return $builder->where('age', '>', 200); } } 在模型的中,需要覆盖其boot方法,在该方法中增加addGlobalScope...本地作用域只对部分查询添加约束,需要手动指定是否添加约束,在模型中添加约束方法,使用前缀scope <?...$query) { return $query->where('active', 1); } } 使用上述添加的本地约束查询,只需要在查询中使用scope前缀的方法,去掉...Mutators 在Eloquent模型中,Accessor和Mutator可以用来对模型的属性进行处理,比如我们希望存储到表中的密码字段要经过加密才行,我们可以使用Laravel的加密工具自动的对它进行加密
然后顺着我贴出的代码,可以一路看到就是如果有read 配置,那么就会先使用 write 配置创建一个主连接,接着调用这个主连接的 setReadPdo() 方法并根据 read 配置又创建了一个从数据库连接...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...在 Builder 中,get() 方法会调用一个 runSelect() 方法,这个方法里面会再调用一个 toSql() 方法,就是获得原始查询语句的方法。...这一个循环是在干嘛?其实,从代码中我们可以看,它在遍历一个本地属性 selectComponents ,并根据这个属性里面的内容去调用自身的这些方法。...当然,更复杂的东西其实还是在构造器中,毕竟在语法生成这里其实是已经到了最后的拼装阶段了。有兴趣的同学可以多深入研究一下 Builder 对象中关于上述功能的方法实现。
\Database\Query\Builder|\App\Merchant whereLastName($value) * @method static \Illuminate\Database\Query...\Database\Query\Builder|\App\Phone whereId($value) * @method static \Illuminate\Database\Query\Builder...\Illuminate\Database\Query\Builder|\App\Product wherePrice($value) * @method static \Illuminate\Database...\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\
static \Illuminate\Database\Query\Builder|\App\Post whereTitle($value) * @method static \Illuminate...\Database\Query\Builder|\App\Post whereSlug($value) * @method static \Illuminate\Database\Query\Builder...static \Illuminate\Database\Query\Builder|\App\Post whereCommentCount($value) * @method static \Illuminate...\Database\Query\Builder|\App\Post whereViewCount($value) * @method static \Illuminate\Database\Query...\Builder|\App\Post whereFavoriteCount($value) * @method static \Illuminate\Database\Query\Builder|\App
php namespace App\Services; use App\Helper\MeiliSearch; use Illuminate\Database\Eloquent\Collection...; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Log; use Laravel\Scout\Builder...return $models[$key]; } return null; })->filter(); } } 当然,其实就是调用方法...,在模型进行增删改查时,也对meilisearch中索引数据同步进行增删改查。...//.... } 接下来需要做的就是将其绑定到 Scout 扩展中,我们可以通过在 AppServiceProvider 的 boot 方法中添加以下代码来实现: // 注册新的搜索引擎 resolve
说明:本文主要学习Laravel Database模块的Query Builder源码。...Query Builder并不复杂或神秘,只是在PDO扩展的基础上又开放封闭的包装了一层,提供了fluent api,使得书写的代码也很简洁流畅。...在看下Query Builder源码之前,先大概探索下illuminate/database package的目录结构。...已经注册了名为'db'的服务即DatabaseManager对象,则实际上魔术调用DatabaseManager中的table()方法,看下__call()魔术方法源码: // $method...return $this->factory->make($config, $name); } 实际上最后还是通过\Illuminate\Database\Connectors
第二步,调用模型对象的delete方法。...既然说到了模型作用域,我们不妨延伸一下,说说这个设计点,以及适用的场景。 比如说有一个查询条件在代码内到处都要用,有没有简写方法,写一次其他地方可以随意调用呢?这就是本地作用域的方法了。...return $query->where('vip', true)->where('trial', false); }} 给本地的作用域方法添加传入的参数: class Contact extends...\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class ActiveScope implements Scope{...', true); }} 在模型 Contact 内调用: use App\Scopes\ActiveScope;use Illuminate\Database\Eloquent\Model;class
根据单一责任开发原则来讲,在laravel的开发过程中每个表都应建立一个model对外服务和调用。...\Query\Builder 调用方法去完成整个SQL。...$parameters); } 转发,调用的是 Illuminate\Database\Connection ,用户处理 table() 方法,随后会通过 table() 方法指向 Illuminate...Builder($query); } 最后我们到了 Illuminate\Database\Eloquent\Builder 文件下,这个类中涵盖了ORM的基本操作,例如find , findOrFail...如果你在代码用到了get方法,抱歉,这里没有,它依旧会通过__call 方法将你的请求转发到 Illuminate\Database\Query\Builder 类中 $this- query- {$method
, $method], $parameters); } 相当于调用Illuminate\Database\Eloquent\Builder对象里的where方法和get方法,这两个方法里其实 其实是封装调用了...Illuminate\Database\Query\Builder对象里的where方法和get方法- get方法里调用了runselect方法 runSelect方法: /** * Run the...$this- useWritePdo); //调用connection 对象的select方法 } 再看connection对象是怎么传到Illuminate\Database\Eloquent\Builder...类实例里的: Model类的newQuery方法: /** * Get a new query builder for the model's table...\Database\Query\Builder } Model类的$resolver属性(连接解析器)的设定是通过 Illuminate\Database\DatabaseServiceProvider
根据单一责任开发原则来讲,在laravel的开发过程中每个表都应建立一个model对外服务和调用。...Illuminate\Database\Query\Builder 调用方法去完成整个SQL。...$parameters); } 转发,调用的是 Illuminate\Database\Connection ,用户处理 table()方法,随后会通过 table() 方法指向 Illuminate\...new Builder($query); } 最后我们到了 Illuminate\Database\Eloquent\Builder 文件下,这个类中涵盖了ORM的基本操作,例如find , findOrFail...如果你在代码用到了get方法,抱歉,这里没有,它依旧会通过__call 方法将你的请求转发到 Illuminate\Database\Query\Builder 类中 $this->query->{$method
数据库管理相关的代码都放在Schema目录下, 最开始的结构如下: src/Illuminate/Database/Schema ├── Blueprint.php └── Builder.php 就两个文件...grammar的compileCommand函数,此处我们调用的是compileCreate函数,至此我们就分析完了数据库表操作的方法,下面我们来看migrations功能。...当我们在命令行中执行php artisan command的时候,会去调用migrateCommand,然后最后会调用Migrator中的函数runMigrations函数,看下面分析: public...,不断去对系统做解耦工作 新增功能 我们接着本篇开头介绍的migrate功能,来看下v1.1.0版本中有的功能, src/Illuminate/Database/Console ├── Migrations...我们通过一个比较有意思的命令Make来看下migration的实现,make的作用是新建一个migration文件,其会根据命令函数参数,去读取src/Illuminate/Database/Migrations
,所以你可以按照自己的喜好在 app 目录下创建 Scopes目录并实现接口(Illuminate\Database\Eloquent\Scope)的方法apply。...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\...php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\...$builder){ $builder->where('status','>', 1); }); } } 有些查询并不想使用作用域,可以通过调用以下方法移除作用域...); } } 调用时不需要加scope前缀,类似于修改器/访问器,并且可以一次性调用多个方法。
全局作用域 假设有些数据库查询操作,无论是在控制器内,或者在模板文件内,或者命令行方法内,都有重复的使用需求,要是在模型内有一个公用的方法,默认就加上这些筛选条件,就可以显著减少代码量了。...在模型文件 Event 内头部引入下述类: use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder...所以,本地作用域 应运而生,专门用于某个模型文件的方法,手动调用的时候就起作用,不调用就不会主动追加。...既然本地作用域返回的是 QueryBuilder 实例,那么自然就可以链式调用本地作用域的方法,和 QueryBuilder 的方法。...讲述了两个方法: 全局作用域:全局起作用,需要手动移除; 本地作用域:只有手动调用起作用,可链式使用; 这样的设计模式可以很大程度上节约查询代码,但是对于维护,需要同等熟悉的开发者彼此遵循开发规范,写出可维护的代码
直接通过编辑器的跳转功能点击 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/...(), $this->getPostProcessor() ); } 注意这个 QueryBuilder 实际上是 use Illuminate\Database\Query\Builder...// laravel/framework/src/Illuminate/Database/Query/Builder.php public function from($table, $as = null
接下我们到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...在程序中判断SQL是否执行成功最准确的方法是通过捕获 QueryException异常 Processor后置处理结果集 processor是用来对SQL执行结果进行后置处理的,默认的processor...; } 之后在QueryBuilder的get方法里将结果集转换成了Collection对象返回给了调用者.
Database\Query\Processors\Processor,其中\Illuminate\Database\MysqlConnector是在ConnectionFactory中构造出来的并通过...\Database\Query\Grammars\Grammar和\Illuminate\Database\Query\Processors\Processor是在MySqlConnection构造函数中通过...public function query() { return new \Illuminate\Database\Query\Builder( $this...Builder提供的fluent api都是在Builder这个类里,上篇也说过这是个非常重要的类。...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
使用模型关联给应用开发带来的收益我认为有以下几点 主体数据和关联数据之间的关系在代码表现上更明显易懂让人一眼就能明白数据间的关系。...、两个模型的关联字段和约束,此外还设置了关联名称,在Model的 belongsTo方法里如果未提供后面的参数会通过debug_backtrace 获取调用者的方法名作为关联名称进而猜测出子模型的外键名称的...'id' // 用户表本地键... ); } } /** * 定义一个远层一对多关联,返回HasManyThrough实例 * @return \Illuminate\Database...,会调用与属性名相同的关联方法,拿到关联实例后会去调用关联实例的 getResults方法返回关联的模型数据。...*注: 下面的代码为了阅读方便我把一些在父类里定义的方法拿到了HasMany中,自己阅读时如果找不到请去父类中找一下。
实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor...MySqlConnection主要就是在执行SQL时做连接MySql数据库操作,MySqlProcessor主要就是用来对执行SQL后的数据集做后置处理操作,这两点已经在之前上篇聊过,那MySqlGrammar...$this->compileUnions($query); } return $sql; } 这里首先会调用Illuminate\Database\Query\...OK, 总的来说,通过了解Query Builder的实现原理后,知道其并不复杂或神秘,只是一个对PDO更友好封装的包裹,Query Builder有几个重要的类或概念:连接类MySqlConnection...OK, illuminate/database package不仅提供了Query Builder,还提供了Eloquent ORM。
领取专属 10元无门槛券
手把手带您无忧上云