\Database\Query\Builder 调用方法去完成整个SQL。...$parameters); } 转发,调用的是 Illuminate\Database\Connection ,用户处理 table()方法,随后会通过 table() 方法指向 Illuminate\...,首先每个 Eloquent ORM 都需要继承父类 Illuminate\Database\Eloquent\Model 你大概会这样写 User::find(1) 父类是不存在这个方法的,它会通过...new Builder($query); } 最后我们到了 Illuminate\Database\Eloquent\Builder 文件下,这个类中涵盖了ORM的基本操作,例如find , findOrFail...如果你在代码用到了get方法,抱歉,这里没有,它依旧会通过__call 方法将你的请求转发到 Illuminate\Database\Query\Builder 类中 $this->query->{$method
软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口的类,该接口只有一个方法apply,在该方法中增加查询需要的约束...Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /** * Apply...the scope to a given Eloquent query builder...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database...return $user->makeVisible('attribute')->toArray(); 为json追加值 有时需要在json中追加一些数据库中不存在的字段,使用下列方法,现在模型中增加一个
\Database\Eloquent\Scope)的方法apply。...php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database...\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class StatusScope implements Scope...* * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\...php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\
\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\
中主要有三件利器:\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构造函数中通过...()->from($table); } public function query() { return new \Illuminate\Database...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
接下我们到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...\Illuminate\Database\Query\Builder $query * @return array */ protected function compileComponents(...* * @param \Illuminate\Database\Query\Builder $query * @return string */ protected function compileWheres
直接通过编辑器的跳转功能点击 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
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
上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。...,我们都知道当调用一个不存在的类方法时PHP会触发魔术方法 __callStatic, 调用不存在的实例方法会触发 __call, 很容易就猜到上面这些方法就是通过这两个魔术方法来动态调用的,下面让我们看一下源码...namespace Illuminate\Database\Eloquent; abstract class Model implements ... { public function __call...namespace Illuminate\Database\Eloquent; class Builder { public function __construct(QueryBuilder...是在Query Builder的基础上做了进一步封装, Eloquent Builder会把这些CRUD方法的调用转给Query Builder里对应的方法来完成操作,所以在Query Builder里能使用的方法到
实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor...$this->compileUnions($query); } return $sql; } 这里首先会调用Illuminate\Database\Query\...$this->columnize($columns); } // Illuminate/Database/Grammar public function columnize...$this->wrapTable($table); } // Illuminate/Database/Grammar public function wrapTable...OK, illuminate/database package不仅提供了Query Builder,还提供了Eloquent ORM。
模型中相关代码如下: use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class...return $query->where('vip', true)->where('trial', false); }} 给本地的作用域方法添加传入的参数: class Contact extends...创建 app/Scopes/ActiveScope.php 文件: namespace App\Scopes;use Illuminate\Database\Eloquent\Scope;use Illuminate...\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class ActiveScope implements Scope{...', true); }} 在模型 Contact 内调用: use App\Scopes\ActiveScope;use Illuminate\Database\Eloquent\Model;class
={$database}"; } 通过构造函数知道最重要的一个方法是createConnection($dsn, $config, $options),该方法实例化了一个PDO,这里就明白了Query...()->from($table); } public function query() { return new \Illuminate\Database...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...={$database}"; } 通过构造函数知道最重要的一个方法是createConnection($dsn, $config, $options),该方法实例化了一个PDO,这里就明白了Query...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
说明:本文主要学习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
找到 laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法,可以看到它还有第三个参数。...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。.../Database/Connection.php 中的 insert() 方法来执行。...在 Builder 中,get() 方法会调用一个 runSelect() 方法,这个方法里面会再调用一个 toSql() 方法,就是获得原始查询语句的方法。...public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) {
mysqlnd.net_read_timeout = 3 当数据库连接超时之后, 抛出异常 新建一个基础模型BaseModel, 其它所有模型继承这个模型, 并重写newEloquentBuilder方法...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class BaseModel extends Model {...public function newEloquentBuilder($query) { return new MysqlCustomBuilder($query);...php namespace App\Models\Database; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database...extends Builder { public function get($columns = ['*']) { try { return parent
对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。...\Database\Eloquent\Model中delete方法源码: public function delete() { if (is_null($this->getKeyName())) {...SoftDeletes trait中加入了Illuminate\Database\Eloquent\SoftDeletingScope全局的Scope。...protected function performJoin(Builder $query = null) { $query = $query ?...$query, Builder $parentQuery, $columns = ['*']) { $query->from( $query->getModel()->getTable().' as
数据库管理相关的代码都放在Schema目录下, 最开始的结构如下: src/Illuminate/Database/Schema ├── Blueprint.php └── Builder.php 就两个文件...Blueprint和Builder,Schema/Builder负责提供数据库操作的面向对象似的操作,而Schema/Blueprint则负责存储具体的操作数据,包括数据库操作的命令和数据库表的定义,因此有下面的结构...: 接着,我们看看是怎么使用Blueprint的,下看创建table $grammar = new Illuminate\Database\Schema\Grammars\MySqlGrammar; $...我们看下到底做了什么,其目录结构是: src/Illuminate/Database/Connectors ├── ConnectionFactory.php ├── Connector.php ├──...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this
Illuminate/Collections/Arr.php 里面的方法。...在所有模型都要继承的 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 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。
通过全局作用域类实现 要实现「全局作用域」,首先需要编写一个实现 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...scopePopular(Builder $query) { return $query->where('views', '>', '0')->orderBy('views', 'desc')...,比如我要在文章中查询指定类型的文章,可以通过在 Post 模型类中定义如下方法: public function scopeOfType(Builder $query, $type) { return