软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现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方法将会被自动的调用 <?
上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。...调用的这些查询相关的方法最后都会通过 __call转而去调用Eloquent Builder实例的这些方法,Eloquent Builder与底层数据库交互的部分都是依赖Query Builder来实现的...的where方法在接到调用请求后直接把请求转给来Query Builder的 where方法,然后get方法也是先通过Query Builder的 get方法执行查询拿到结果数组后再通过 newFromBuilder...方法把结果数组转换成Model对象构成的集合,而另外一个比较常用的方法 first也是在 get方法的基础上实现的,对query应用limit 1,再从 get方法返回的集合中用 Arr::first(...是在Query Builder的基础上做了进一步封装, Eloquent Builder会把这些CRUD方法的调用转给Query Builder里对应的方法来完成操作,所以在Query Builder里能使用的方法到
\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Flight extends Model {...* * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) { return...$query->where('votes', '>', 100); } /** * 只包含激活用户的查询作用域 * * @return \Illuminate\Database\Eloquent...* @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database...\Eloquent\Builder */ public function scopeOfType($query, $type) { return $query->where('type', $
Illuminate\Database\Query\Builder 调用方法去完成整个SQL。...$parameters); } 转发,调用的是 Illuminate\Database\Connection ,用户处理 table()方法,随后会通过 table() 方法指向 Illuminate\...$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
,所以你可以按照自己的喜好在 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前缀,类似于修改器/访问器,并且可以一次性调用多个方法。
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
中主要有三件利器:\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构造函数中通过...public function query() { return new \Illuminate\Database\Query\Builder( $this...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
在所有模型都要继承的 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 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。...但是,这里划重点了,Eloquent\Builder 中有些方法是没有的,比如说 insert()、insertGetId() ,在模型中,使用 save() 就可以代替这两个方法的操作。
直接通过编辑器的跳转功能点击 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..., 为了方便阅读我们假定执行条件 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\Model model与表名的关系...\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /**...* 将范围应用于给定的 Eloquent 查询生成器 * * @param \Illuminate\Database\Eloquent\Builder $builder...; use Illuminate\Database\Eloquent\Builder; class User extends Model { protected static function...public function scopeFlag($query){ return $query->where('flag',1); //状态为上架的书 } 调用本地作用域 直接调用scope
实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor...$this->compileUnions($query); } return $sql; } 这里首先会调用Illuminate\Database\Query\...MySqlConnection::select() 上文聊到Builder::runSelect()调用了三个方法:MySqlConnection::select(), Builder::toSql()...OK, 总的来说,通过了解Query Builder的实现原理后,知道其并不复杂或神秘,只是一个对PDO更友好封装的包裹,Query Builder有几个重要的类或概念:连接类MySqlConnection...OK, illuminate/database package不仅提供了Query Builder,还提供了Eloquent ORM。
\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\
第二步,调用模型对象的delete方法。...模型中相关代码如下: use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class...创建 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
模块,修改composer.json,"require"下新增一行"illuminate/database": "^5.4" { "description": "The CodeIgniter.../vendor/autoload.php'); 修改application/config/database.php //注释以下内容 //$active_group = 'default'; //$query_builder...' => TRUE //); // 新增下面内容 use Illuminate\Database\Capsule\Manager as Capsule; $active_group = 'default...'; $query_builder = TRUE; $db['default'] = array( 'dsn' => '', 'hostname' => '127.0.0.1',...php use \Illuminate\Database\Eloquent\Model as Eloquent; # 确保数据库中有orders表 class Order extends Eloquent
={$database}"; } 通过构造函数知道最重要的一个方法是createConnection($dsn, $config, $options),该方法实例化了一个PDO,这里就明白了Query...public function query() { return new \Illuminate\Database\Query\Builder( $this...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...public function query() { return new \Illuminate\Database\Query\Builder( $this...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
找到 laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法,可以看到它还有第三个参数。...SQL 语句,会交给连接,也就是 laravel/framework/src/Illuminate/Database/Connection.php 中的 insert() 方法来执行。...这个就是我们最早学习使用过的那个原生查询所调用的方法。接下来,我们再看一下 get() 方法,也就是获得查询结果集的方法。...在 Builder 中,get() 方法会调用一个 runSelect() 方法,这个方法里面会再调用一个 toSql() 方法,就是获得原始查询语句的方法。...相信经过这一系列的学习,这个文件的内容对你已经不陌生了,也相信你已经可以自己独立的分析剩下的内容了。
如果有一些查询需要在多个地方调用,那么在每个地方都要编写同样的代码,有没有什么办法对这种场景下的查询代码进行优化呢? Eloquent 模型类提供的「Scope」功能就可以帮我们实现这种优化。...我们将那些需要在多处调用的查询条件编写过滤器,然后将调用查询代码的地方改为调用过滤器,调用过滤器比编写那些冗长而重复的查询方法更加便捷,可读性也更好。...通过全局作用域类实现 要实现「全局作用域」,首先需要编写一个实现 Illuminate\Database\Eloquent\Scope 接口的全局作用域类,这里我们将其命名为 EmailVerifiedAtScope...php namespace App\Scopes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent...,比如我要在文章中查询指定类型的文章,可以通过在 Post 模型类中定义如下方法: public function scopeOfType(Builder $query, $type) { return
数据库管理相关的代码都放在Schema目录下, 最开始的结构如下: src/Illuminate/Database/Schema ├── Blueprint.php └── Builder.php 就两个文件...grammar的compileCommand函数,此处我们调用的是compileCreate函数,至此我们就分析完了数据库表操作的方法,下面我们来看migrations功能。...:是前一篇讲的对于Active Record模式中Model的功能,包括了Model、Builder和Relation功能,忘记的可以去看前一篇orm 系列 之 Eloquent演化历程1的内容 Query...,不断去对系统做解耦工作 新增功能 我们接着本篇开头介绍的migrate功能,来看下v1.1.0版本中有的功能, src/Illuminate/Database/Console ├── Migrations...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this
,同时会定义一些静态方法,如create,find,save,充当了Row Data Gateway角色,此时的类图如下: 此时新增的Model类直接依赖于Connection和Builder,带来的问题是耦合...use Illuminate\Database\Query\Builder as BaseBuilder; class Builder extends BaseBuilder { /**...* * @var Illuminate\Database\Eloquent\Model */ protected $model; .... } 里面具体就是在基础...此时关系处理上主要的逻辑是调用Model的HasOne等表关系的方法,返回Relation的子类,然后通过Relation来处理进而返回数据,这么说可能有点绕,我们下面具体介绍下每个关系的实现,大家可能就理解了...Model的hasOne方法后,返回是一个HasOne,即Relation,当我们调用Relation的方法时,是怎么处理的呢?