Illuminate\Database\Query\Builder 调用方法去完成整个SQL。...这个文件在你项目目录中的 vendor/laravel/framework/src/Illuminate/Database/Query 下,你可以自行去查看。...$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
开发环境:Laravel5.1+MAMP+PHP7+MySQL5.5 先写个店铺列表页 1.先装上开发插件三件套(具体可参考:Laravel5.2之Seeder填充数据小技巧) 不管咋样,先装上开发插件三件套...\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...\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\
直接通过编辑器的跳转功能点击 update() 方法就会跳转到 laravel/framework/src/Illuminate/Database/Query/Builder.php 的 update(...这个就要一步一步来看了,前面其实我们已经看到了 laravel/framework/src/Illuminate/Database/Query/Builder.php 这个对象的类文件,那么我们是怎么通过...这个对象继承的 laravel/framework/src/Illuminate/Database/Connection.php 类中,就有一个 table() 方法。...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
应用场景 某些SQL语句需要加某些共同的条件,例如status > 0,如果我们每条SQL语句都加的话显然是很麻烦的,作为一个优雅的框架,当然有相应的解决办法 编写作用域 Laravel 应用默认并没有为作用域预定义文件夹...,所以你可以按照自己的喜好在 app 目录下创建 Scopes目录并实现接口(Illuminate\Database\Eloquent\Scope)的方法apply。...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\...$builder){ $builder->where('status','>', 1); }); } } 有些查询并不想使用作用域,可以通过调用以下方法移除作用域...); } } 调用时不需要加scope前缀,类似于修改器/访问器,并且可以一次性调用多个方法。
中主要有三件利器:\Illuminate\Database\MysqlConnector;\Illuminate\Database\Query\Grammars\Grammar;\Illuminate\...Database\Query\Processors\Processor,其中\Illuminate\Database\MysqlConnector是在ConnectionFactory中构造出来的并通过...\Database\Query\Grammars\Grammar和\Illuminate\Database\Query\Processors\Processor是在MySqlConnection构造函数中通过...,是在后续执行SQL语句时调用Connection::select()执行的,之前的Laravel版本是没有封装在闭包里而是先执行了连接操作,Laravel5.3是封装在了闭包里等着执行SQL语句再连接操作...public function query() { return new \Illuminate\Database\Query\Builder( $this
找到 laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法,可以看到它还有第三个参数。...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...SQL 语句,会交给连接,也就是 laravel/framework/src/Illuminate/Database/Connection.php 中的 insert() 方法来执行。...这个就是我们最早学习使用过的那个原生查询所调用的方法。接下来,我们再看一下 get() 方法,也就是获得查询结果集的方法。...在 Builder 中,get() 方法会调用一个 runSelect() 方法,这个方法里面会再调用一个 toSql() 方法,就是获得原始查询语句的方法。
我们从软删除的使用,再顺便说一说模型内的作用域的概念。 代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。...第二步,调用模型对象的delete方法。...模型中相关代码如下: use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class...\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class ActiveScope implements Scope{...', true); }} 在模型 Contact 内调用: use App\Scopes\ActiveScope;use Illuminate\Database\Eloquent\Model;class
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
,是在后续执行SQL语句时调用Connection::select()执行的,之前的Laravel版本是没有封装在闭包里而是先执行了连接操作,Laravel5.3是封装在了闭包里等着执行SQL语句再连接操作...={$database}"; } 通过构造函数知道最重要的一个方法是createConnection($dsn, $config, $options),该方法实例化了一个PDO,这里就明白了Query...public function query() { return new \Illuminate\Database\Query\Builder( $this...,是在后续执行SQL语句时调用Connection::select()执行的,之前的Laravel版本是没有封装在闭包里而是先执行了连接操作,Laravel5.3是封装在了闭包里等着执行SQL语句再连接操作...public function query() { return new \Illuminate\Database\Query\Builder( $this
数据库管理相关的代码都放在Schema目录下, 最开始的结构如下: src/Illuminate/Database/Schema ├── Blueprint.php └── Builder.php 就两个文件...grammar的compileCommand函数,此处我们调用的是compileCreate函数,至此我们就分析完了数据库表操作的方法,下面我们来看migrations功能。...:是前一篇讲的对于Active Record模式中Model的功能,包括了Model、Builder和Relation功能,忘记的可以去看前一篇orm 系列 之 Eloquent演化历程1的内容 Query...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this...*版本的时候,laravel/framework还采用的psr-0规范,所有其目录层级还是src/Illuminate/Database,在这个版本中有个新的目录Capsule,其下面是一个Manager
laravel/framework/src/Illuminate/Collections/Collection.php 是集合类,里面的方法大部分都调用的是 laravel/framework/src/...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...不过这里需要注意的是,模型默认生成的 QueryBuilder 是 llaravel/framework/src/Illuminate/Database/Eloquent/Builder.php 对象,...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。
说明:本文主要学习Laravel Database模块的Query Builder源码。...实际上,Laravel通过Schema Builder来设计数据库,通过Query Builder来CURD数据库。...在看下Query Builder源码之前,先大概探索下illuminate/database package的目录结构。...是核心的组件,也是类最多的文件夹 Events 装载事件类的文件夹 Migrations 实际执行migrate相关命令的类 Query Query Builder的代码主要在这个文件夹,主要的类是Builder...DatabaseManager对象,则实际上魔术调用DatabaseManager中的table()方法,看下__call()魔术方法源码: // $method = 'table', $parameters
软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口的类,该接口只有一个方法apply,在该方法中增加查询需要的约束...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database...$query) { return $query->where('active', 1); } } 使用上述添加的本地约束查询,只需要在查询中使用scope前缀的方法,去掉...function scopeOfType($query, $type) { return $query->where('type', $type); } 调用的时候 $users = App\...假设我们有一个字段是first_name,当我们尝试去获取first_name的值的时候,getFirstNameAttribute方法将会被自动的调用 <?
在模型文件 Event 内头部引入下述类: use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder...所以,本地作用域 应运而生,专门用于某个模型文件的方法,手动调用的时候就起作用,不调用就不会主动追加。...而声明一个本地作用域,只要遵循laravel的语法规定即可,如下示例: public function scopePublished($query) { return $query->where('published...调用的时候要手动追加上: $events = Event::published()->get(); 其中 published()方法就是映射到 scopePublished 方法。...既然本地作用域返回的是 QueryBuilder 实例,那么自然就可以链式调用本地作用域的方法,和 QueryBuilder 的方法。
接下我们到QueryBuilder类文件 \Illuminate\Database\Query\Builder.php里看看它里面的源码 namespace Illuminate\Database\Query..., 为了方便阅读我们假定执行条件 where('name','=','James') //class \Illuminate\Database\Query\Builder public function...->compileSelect($this); } /** * 将Select查询编译成SQL语句 * @param \Illuminate\Database\Query\Builder $query...; } /** * 编译Select查询语句的各个部分 * @param \Illuminate\Database\Query\Builder $query * @return array...、 wheres属性,那么我们见先来看看这三个属性的编译器: /** * 编译Select * 部分的SQL * @param \Illuminate\Database\Query\Builder
对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。....已删除数据可以恢复 Model的软删除功能实现 Illuminate\Database\Eloquent\Model中delete方法源码: public function delete() {...方法会覆盖父类的方法,最终通过 runSoftDelete方法更新删除标记。...->update($columns); } Model查询过滤删除数据 Laravel中允许在Model中static::addGlobalScope方法添加全局的Scope。...SoftDeletes trait中加入了Illuminate\Database\Eloquent\SoftDeletingScope全局的Scope。
前言 Laravel官方已经有scout+meilisearch 的一键扩展包 见:https://packagist.org/packages/laravel/scout 但是,肯定是不支持5.8版本的...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(); } } 当然,其实就是调用方法...Scout 扩展中,我们可以通过在 AppServiceProvider 的 boot 方法中添加以下代码来实现: // 注册新的搜索引擎 resolve(EngineManager::class)-
Laravel 官方开发组本周发布了 Laravel 6.11.0 版本,新版本在 Eloquent 模型查询时新增 firstWhere 方法,优化了基于 Redis 的多频道广播,以及一些现有版本的问题修复...1、新增功能 Eloquent firstWhere() 方法 Eloquent 模型现在支持调用 firstWhere 方法,它的功效和 where()->first() 一样,算是一个语法糖: /...优化 Redis 多频道广播 在 Laravel 应用中,一次发送事件到多个频道很常见,目前,我们的做法是通过多个发布命令发送完全一样的负载数据到指定 Redis 服务器,这将导致不必要的数据传输,从而带来通信及性能损耗...新增特性 新增 Illuminate\Database\Eloquent\Builder::firstWhere() 方法 Redis 支持一次广播数据到多个频道 问题修复 修复 WithFaker:...:makeFaker() 中的未定义属性 修复 Str::afterLast() 方法 修复 PHP 7.3 插入浮点类型到 MySQL 数据库问题 修复通过自定义中间表属性名刷新模型问题 代码调整 在
实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor...开发环境:Laravel5.3 + PHP7 Builder::toSql() 看下toSql()的源码: public function toSql() { // $this...$this->compileUnions($query); } return $sql; } 这里首先会调用Illuminate\Database\Query\...MySqlConnection::select() 上文聊到Builder::runSelect()调用了三个方法:MySqlConnection::select(), Builder::toSql()...OK, illuminate/database package不仅提供了Query Builder,还提供了Eloquent ORM。