在 Laravel 中,默认情况下这个值设置的就是 PDO::FETCH_OBJ 。关于如何修改成 PDO::FETCH_ASSOC ,我们会在后面的文章中学习。...直接通过编辑器的跳转功能点击 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/...// laravel/framework/src/Illuminate/Database/Query/Builder.php public function from($table, $as = null
但是你要知道的是,Laravel 以及现代化的所有框架都是可以方便地配置主从分离的。另外,我们还要再回去 查询构造器 中,看一下我们的原生 SQL 语句的拼装语法到底是如何生成的。...很明显,第二个路由的查询语句走的就是另一个数据库了。 对于如何实现的读写分离,我们从 原生查询 的 select() 方法来看。...这里使用的是 语法 这个高大上的词汇,实际上简单的理解就是 查询构造器 是如何生成 SQL 语句的。原生查询 就不用多说了,都是我们自己写 SQL 语句让 PDO 执行就好了。...其实我们在 查询构造器 那篇文章中就已经看到过 Laravel 是如何生成 SQL 语句了,还记得我们分析的那个 update() 方法吗?...public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) {
思考:如何提高Model层查询DB的效率?如何精简代码?...经过一番调研之后发现了一个堪称神器的扩展:laravel-upsert 这个 Laravel 扩展为查询构建器和 Eloquent 添加了对 INSERT & UPDATE (UPSERT) 和 INSERT...的强大,不仅减少了代码量,也减少了sql 查询次数,提升了性能。...Lumen 如果您使用 Lumen,则必须手动实例化查询构建器: $builder = new \Staudenmeir\LaravelUpsert\Query\Builder(app('db')->connection...()); $builder->from(...)
->update($columns); } Model查询过滤删除数据 Laravel中允许在Model中static::addGlobalScope方法添加全局的Scope。...这样就可以在查询条件中添加一个全局条件。Laravel中软删除数据的过滤也是使用这种方式实现的。...Laravel远程关联关系通过hasManyThrough实现。里面有两个地方涉及到软删除的查询。...protected function performJoin(Builder $query = null) { $query = $query ?...$query, Builder $parentQuery, $columns = ['*']) { $query->from( $query->getModel()->getTable().' as
那PDO实例是如何得到的呢?...OK,那Query Builder是如何把书写的api编译成SQL呢?...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...OK,那Query Builder是如何把书写的api编译成SQL呢?...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public
如下例 public function index(Request $request, Topic $topic) { $query = $topic->query();...正确的做法应该是,服务端返回基础数据,在根据客户端传参返回其相关联的数据 如何实现?...通过laravel第三方扩展包 spatie/laravel-query-builder 官方文档:https://docs.spatie.be/laravel-query-builder/v2/introduction.../ 1.composer 引入 composer require spatie/laravel-query-builder 2.控制器使用 use Spatie\QueryBuilder\QueryBuilder...fillter[title]=none模糊查找title包含none的文章 AllowedFilter::exact('category_id'):表示精确过滤的字段 我们还可以键入某个scope(查询作用域
laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。 但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。...events WHERE `published` = 1; 如果条件 published = 1 在默认的情况下需要开启,我们可以使用laravel模型的 全局作用域 方式为所有查询追加上这个条件。...$builder) { $builder->where('published', '=', 1); }); } 这样SQL语句 where published = 1 就会追加到所有的模型查询方法内...而声明一个本地作用域,只要遵循laravel的语法规定即可,如下示例: public function scopePublished($query) { return $query->where('published...比如有这样一个查询需求: $events = Event::where('zip', $zipCode)->get(); 使用本地作用域实现出来: public function scopeZip($query
那PDO实例是如何得到的呢?...OK,那Query Builder是如何把书写的api编译成SQL呢?...编译API成SQL 还是以上篇说到的一行简单的fluent api为例: Route::get('/query_builder', function() { // Query Builder...在看下这两步骤之前,先看下后置处理器对查询的结果集做了什么后置操作: // \Illuminate\Database\Query\Processors\Processor public...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时见。
接下我们到QueryBuilder类文件 \Illuminate\Database\Query\Builder.php里看看它里面的源码 namespace Illuminate\Database\Query...(Builder $query) { $original = $query->columns; //如果没有QueryBuilder里没制定查询字段,那么默认将*设置到查询字段的位置...if (is_null($query->columns)) { $query->columns = ['*']; } //遍历查询的每一部份,如果存在就执行对应的编译器来编译出那部份的...Query\Builder $query * @return array */ protected function compileComponents(Builder $query) {...(Builder $query) { if (is_null($query->wheres)) { return ''; } //每一种where查询都有它自己的编译器函数来创建
说明:本文主要说明Laravel Eloquent的延迟预加载(Eager Loading),使用延迟预加载来减少MySQL查询次数。同时,会将开发过程中的一些截图和代码黏上去,提高阅读效率。...: composer require barryvdh/laravel-debugbar --dev composer require barryvdh/laravel-ide-helper --dev...\Builder|\App\Product whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Product...\Builder|\App\Product whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\App...\Query\Builder|\App\Shop whereMerchantId($value) * @method static \Illuminate\Database\Query\Builder
而另外一个 map() 函数就不用多说了,之前我们说过,Laravel 的 PDO 在默认查询构造器的情况下,走的是 PDO::FETCH_OBJ ,获得的集合结果中的每个数据都是一个 stdClass...laravel/framework/src/Illuminate/Collections/Collection.php 是集合类,里面的方法大部分都调用的是 laravel/framework/src/...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。
代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。第二步,调用模型对象的delete方法。...在laravel中, 这个软删除字段默认是 deleted_at。你也可以在模型中手动指定。...Contact extends Model{ public function scopeStatus($query, $status) { return $query-...如果是想软删除条目那样,默认把所有的查询都追加 自定义的查询条件,就需要我们上面说的全局作用域了。...$builder) { $builder->where('active', true); }); }} 那么所有的模型查询,都会默认加上声明中的where
使用模型关联预加载后,在效率上高于开发者自己写join和子查询,模型关联底层是通过分别查询主体和关联数据再将它们关联匹配到一起。...按照Laravel设定好的模式来写关联模型每个人都能写出高效和优雅的代码 (这点我认为适用于所有的Laravel特性)。...动态属性加载关联模型 上面我们定义了三种使用频次比较高的模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来的。...[] : $columns; $builder = $this->query->applyScopes(); $models = $builder->addSelect...模型关联常用的一些功能的底层实现到这里梳理完了,Laravel把我们平常用的join, where in 和子查询都隐藏在了底层实现中并且帮我们把相互关联的数据做好了匹配。
查询作用域 全局作用域 全局作用域允许你对给定模型的所有查询添加约束。使用全局作用域功能可以为模型的所有操作增加约束。...; class AgeScope implements Scope { /** * Apply the scope to a given Eloquent query builder...$builder) { $builder->where('age', '>', 200); }); 查询中要移除全局约束的限制,使用withoutGlobalScope方法 // 只移除age约束...$query) { return $query->where('active', 1); } } 使用上述添加的本地约束查询,只需要在查询中使用scope前缀的方法,去掉...Mutators 在Eloquent模型中,Accessor和Mutator可以用来对模型的属性进行处理,比如我们希望存储到表中的密码字段要经过加密才行,我们可以使用Laravel的加密工具自动的对它进行加密
而且我也是从Java,golang裸转的php。这里不谈那种语言好坏之分。开发来说,拥抱技术,拥抱变化,公司用什么技术栈,你就用什么技术。熟练开发就好了。...这个语法是并且 (and) 关系语法这个语法是或者 (or) 关系语法 采取model进行sql增删改查(常用) 9.4 查询 laravel中对数据库开发模型非常重要。...= UserModel::query()->from('user AS u')->selectRaw('u.*'); $builderData = $builder->join('contract AS...更高级的用法,更多内容建议看官方文档:https://learnku.com/docs/laravel/7.x/eloquent/7499 总结 laravel框架采取链式查询sql。...更多的sql链式编写查询官方文档,应该是很快可以上手的。 之后还有比laravel更高级的用法lumen框架,就类似Java的mybatis-plus与mybatis。
应用场景 某些SQL语句需要加某些共同的条件,例如status > 0,如果我们每条SQL语句都加的话显然是很麻烦的,作为一个优雅的框架,当然有相应的解决办法 编写作用域 Laravel 应用默认并没有为作用域预定义文件夹...addGlobalScope(new StatusScope()); } } 添加作用域后,如果使用 ScopeTest::all() 查询则会生成如下...$builder){ $builder->where('status','>', 1); }); } } 有些查询并不想使用作用域,可以通过调用以下方法移除作用域...$users = ScopeTest::status()->type()->get(); ScopeTest::status()->orWhere(function (Builder $query) {...$query->type(); })->get();
上一篇介绍了Eloquent的migrations和Scheme Builder功能,本文介绍Eloquent最重要的Model。...本文会按照下面的顺序介绍: Model的创建 CRUD操作 查询和聚合操作 Hydrate 组合查询 Model创建 在laravel中,创建一个model非常简单,我们可以通过下面的命令创建 php...查询和聚合 Eloquent提供了丰富的查询方式,通过前面的__call方法分析,我们知道,这些最终调用的都是Eloquent/Builder方法,where方法也不例外,where其最简单的形式如下:...Hydrate 这个功能其实我们在之前The Clean Architecture in PHP 读书笔记(十)就提到过这个问题,如何能在数据库中记录和我们的Model之间进行转换,此处有转换有两个方向...,先看数据记录怎么变为Model,此处有几个方法 Model::create新建, Model::hydrate将数据库数据转换为Model 当时遇到的问题有字段对应,另一个是安全问题,具体来说就是怎么知道数组中的
说明:本文主要学习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 Eloquent 的小技巧 11....但是查询的返回都是一个 Collection 对象,Laravel 为集合提供了很多方便的操作方法,sortBy 就是其中一个,当然还可以用 filter 等集合操作) 12....$builder) { $builder->orderBy('name', 'asc'); }); } 这里还有更多关于请求范围作用域的介绍。...正确的方法稍微有些复杂,需要用到闭包函数作为子查询: $q->where(function ($query) { $query->where('gender', 'Male')...->where('age', '>=', 18); })->orWhere(function($query) { $query->where('gender', 'Female')