\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Flight extends Model {...\Database\Eloquent\Builder */ public function scopePopular($query) { return $query->where('votes...', '>', 100); } /** * 只包含激活用户的查询作用域 * * @return \Illuminate\Database\Eloquent\Builder */ public...\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database\Eloquent\Builder.../ 分离多对多关联模型 $user = App\User::find(1); // 在连接模型的中间表中插入记录 $user->roles()->attach($roleId); // 插入数据和附加的数组到中间表
编写全局作用域 1.定义一个类 namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database...\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /**...* 将范围应用于给定的 Eloquent 查询生成器 * * @param \Illuminate\Database\Eloquent\Builder $builder...\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class User extends Model {...\Database\Eloquent\Model,而中间表模型继承自Illuminate\Database\Eloquent\Pivot 创建中间表模型 namespace App; use Illuminate
\Database\Query\Builder 调用方法去完成整个SQL。...这个文件在你项目目录中的 vendor/laravel/framework/src/Illuminate/Database/Query 下,你可以自行去查看。...,首先每个 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
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 \Illuminate\Database\Eloquent\Builder */ public function scopePopular...* * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive(
* * @param \Illuminate\Database\Eloquent\Builder $query * @param string...\Database\Eloquent\Builder */ public function scopeSort(Builder $query, $column, $direction)...* * @param \Illuminate\Database\Eloquent\Builder $query * @param array...$search * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeSearch...我尝试debug进入where()函数看了看它内部的实现,src/Illuminate/Database/Query/Builder.php: public function where($column
接下来,我们就来演示如何在 Eloquent 模型类上使用「作用域」进行查询。...通过全局作用域类实现 要实现「全局作用域」,首先需要编写一个实现 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')
中主要有三件利器:\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构造函数中通过...那PDO实例是如何得到的呢?...OK,那Query Builder是如何把书写的api编译成SQL呢?
直接通过编辑器的跳转功能点击 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
本文是orm系列的第三篇,也是Eloquent演化的第二篇,Eloquent系列会尝试着讲清楚Eloquent是如何一步一步演化到目前功能强大的版本的,但是毕竟个人能力有限,不可能分析的非常完善,总会有不懂的地方...数据库管理相关的代码都放在Schema目录下, 最开始的结构如下: src/Illuminate/Database/Schema ├── Blueprint.php └── Builder.php 就两个文件...: 接着,我们看看是怎么使用Blueprint的,下看创建table $grammar = new Illuminate\Database\Schema\Grammars\MySqlGrammar; $...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this...,再提供Starter Package让框架使用者可以透过composer建立项目,因此我们从eloquent-v4.0.0开始,我们会开始看项目laravel/framework。
但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。 [img] 本文就来讲讲,连模型的自我瘦身,缩减模型的代码。...在模型文件 Event 内头部引入下述类: use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder...$builder) { $builder->where('published', '=', 1); }); } 这样SQL语句 where published = 1 就会追加到所有的模型查询方法内...,只要是创建生成了 QueryBuilder 对象的,都会附加上此约束语句。...我们再声明一个本地作用域方法: public function scopeAttendees($query, $maximum) { return $query->where('max_attendees
OK,那Query Builder是如何把书写的api编译成SQL呢?...()->from($table); } public function query() { return new \Illuminate\Database...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...OK,那Query Builder是如何把书写的api编译成SQL呢?...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /**...php namespace App; use Illuminate\Database\Eloquent\Model; class Phone extends Model { /**...php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { /**...php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /**...$user->roles()->detach($roleId); // 移除用户的所有角色 $user->roles()->detach(); attach和detach方法支持数组参数,同时添加和移除多个
上篇文章我们讲了Database的查询构建器Query Builder, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。...Eloquent Model以上文讲到的Query Builder为基础提供了Eloquent Builder与数据库进行交互,此外还提供了模型关联优雅地解决了多个数据表之间的关联关系。...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里能使用的方法到
找到 laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法,可以看到它还有第三个参数。...: $this->getPdo(); } // $this->readPdo laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php...在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) {...对于主从数据库来说,一般中大型的业务项目会应用得比较广泛,它实现的原理其实也并不复杂。
准备 需求: 获取项目下的所有任务,且需要合并公共任务 逻辑关系: • 一个项目有很多任务• 一个项目有很多项目成员• 一个任务有一个执行人 (当任务类型为:1 的时候为公共事务)• 一个人有多个项目...• 一个人有多个任务 前端所需数据格式如下: { "user1": { "id": 1, "name": "Lhao", "email": "lhao@qq.com...\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes; class Project extends Model{...\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes; class Task extends Model{ use...user_id', 'name', ]; const COMMON_TASK_TYPE = 1; public function scopeOfCommonTask(Builder
还是以官方文档的例子说起,一个 Country 模型可以通过中间的 User 模型获得多个 Post 模型。在这个例子中,您可以轻易地收集给定国家的所有博客文章。...'id' // 用户表本地键... ); } } /** * 定义一个远层一对多关联,返回HasManyThrough实例 * @return \Illuminate\Database...->throughParent->getQualifiedDeletedAtColumn()); } } } 定义远层一对多关联会返回一个 \Illuminate\Database...动态属性加载关联模型 上面我们定义了三种使用频次比较高的模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来的。...[] : $columns; $builder = $this->query->applyScopes(); $models = $builder->addSelect
本文是orm系列的第二篇,也是Eloquent演化的第一篇,Eloquent系列会尝试着讲清楚Eloquent是如何一步一步演化到目前功能强大的版本的,但是毕竟个人能力有限,不可能分析的非常完善,总会有不懂的地方...use Illuminate\Database\Query\Builder as BaseBuilder; class Builder extends BaseBuilder { /**...* * @var Illuminate\Database\Eloquent\Model */ protected $model; .... } 里面具体就是在基础...($this->query, $method)) { return call_user_func_array(array($this->query, $method), $parameters...以上就是我们分析的HasOne的实现,其他的关系都类似,此处不再重复,然后eager load的含义是指,当我们要加载多个数据的时候,我们尽可能用一条sql解决,而不是多条sql,具体来说如果我们有多个
Elasticsearch 集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型 (Types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段...php namespace App; use Illuminate\Database\Eloquent\Model; use Laravel\Scout\Searchable; class Article...@paginate(defaultCount: 10, builder: "App\\Article@searchArticles") 然后再解析 public function searchArticles...($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { $query = $...args['keyWord']; return Article::search($query); } 完成!
对于一般的发行版本,只提供了 6 个月的错误修复和 1 年的安全修复。对于包括 Lumen 在内的所有其他版本,只有最新版本才会修复错误。此外,请查阅 Laravel 支持的 数据库版本。...php namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class Json implements...CastsAttributes { /** * 将取出的数据进行转换 * * @param \Illuminate\Database\Eloquent\Model...php namespace App; use App\Casts\Json; use Illuminate\Database\Eloquent\Model; class User extends...任何附加的 HTML 属性都指定于一个可以被管理的自动包含$attribute 变量的组件,它是一个属性包的实例。
\Database\DatabaseManager 二是数据库连接工厂阶段,\Illuminate\Database\Connectors\ConnectionFactory 三是数据库连接器阶段,\Illuminate...(\Illuminate\Database\Query\Builder)实例封装了数据库连接实例、请求语法实例和结果处理实例,这里类的实例提供了统一的接口方法供查询构造器实例使用 5.查询构造器使用阶段...: SQL语句准备阶段,Illuminate\Database\Query\Grammars SQL语句执行阶段,Illuminate\Database\Connection C.Eloquent ORM...1.两个阶段 Eloquent ORM查询构造器的生成,Illuminate\Database\Eloquent\Model::newQuery() 操作命令的执行,Illuminate\Database...\Eloquent\Builder 2.ORM映射最大的好处是将数据表的结构映射成一个类对象,可以将数据以对象的形式封装使用,程序的编写将变得高效而且结构清晰 3.对于多个表而且表间存在不同的关系时,如果使用不好会严重影响程序的性能