思考:如何提高Model层查询DB的效率?如何精简代码?...除 SQL Server 外的所有数据库都要求这些列具有PRIMARY或UNIQUE索引。 提供要更新的列作为第三个参数(可选)。默认情况下,将更新所有列。...该查询将为每个帖子和日期创建一个新记录或增加现有的查看计数器: DB :: table ( 'stats' )-> upsert ( [ [ 'post_id' => 1 , '...Lumen 如果您使用 Lumen,则必须手动实例化查询构建器: $builder = new \Staudenmeir\LaravelUpsert\Query\Builder(app('db')->connection...()); $builder->from(...)
说明:本文主要学习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 以及现代化的所有框架都是可以方便地配置主从分离的。另外,我们还要再回去 查询构造器 中,看一下我们的原生 SQL 语句的拼装语法到底是如何生成的。...对于如何实现的读写分离,我们从 原生查询 的 select() 方法来看。...从这里我们可以看出,Laravel 是根据参数来判断是否使用从库连接进行查询的,而我之前看过其它框架的源码,是 Yii 还是 TP 什么来着,有根据查询语句是否有 SELECT 字符来判断走从库去查询的...这里使用的是 语法 这个高大上的词汇,实际上简单的理解就是 查询构造器 是如何生成 SQL 语句的。原生查询 就不用多说了,都是我们自己写 SQL 语句让 PDO 执行就好了。...其实我们在 查询构造器 那篇文章中就已经看到过 Laravel 是如何生成 SQL 语句了,还记得我们分析的那个 update() 方法吗?
那PDO实例是如何得到的呢?...OK,那Query Builder是如何把书写的api编译成SQL呢?...Builder对象 return $this; } 从Builder类中where('id', '=', 1)的源码中可看出,重点就是把where()中的变量值按照$column...OK,那Query Builder是如何把书写的api编译成SQL呢?...Builder对象 return $this; } 从Builder类中where('id', '=', 1)的源码中可看出,重点就是把where()中的变量值按照$column
那PDO实例是如何得到的呢?...OK,那Query Builder是如何把书写的api编译成SQL呢?...编译API成SQL 还是以上篇说到的一行简单的fluent api为例: Route::get('/query_builder', function() { // Query Builder...Builder对象 return $this; } 从Builder类中where('id', '=', 1)的源码中可看出,重点就是把where()中的变量值按照column...总结:本文主要学习了Query Builder的数据库连接器和编译API为SQL相关源码。编译SQL细节和执行SQL的过程下篇再聊,到时见。
在 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第三方扩展包 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...none模糊查找title包含none的文章 AllowedFilter::exact('category_id'):表示精确过滤的字段 我们还可以键入某个scope(查询作用域)对数据进一步过滤,本文使用了定义好的...,但是代码不够精炼,试想如果我们每个资源都要使用include机制那每个方法都会键入类似如下代码 $topics = QueryBuilder::for(Topic::class) ->
不过我搜索了一下自己的星球,发现我的确没有讲过如何调试PHP代码,那么回答一下这个问题也未尝不可。...(Builder $query, array $search = []) { if (empty($search)) { return $query;...($query, $boolean); } 可以观察到,这里面有个很重要的回调,遍历了用户输入的第一个数组参数column,当发现其键名是一个数字,且键值是一个数组时,将会调用[query, method...那么旧版本如何来利用呢?...rcrowe/twigbridge用于在Laravel和Twig之间建立一个桥梁,让Laravel框架可以直接使用twig模板引擎。
按照Laravel设定好的模式来写关联模型每个人都能写出高效和优雅的代码 (这点我认为适用于所有的Laravel特性)。...说了这么多下面我们就通过实际示例出发深入到底层看看模型关联是如何解决数据关联匹配和加载关联数据的。 在开发中我们经常遇到的关联大致有三种:一对一,一对多和多对多,其中一对一是一种特殊的一对多关联。...动态属性加载关联模型 上面我们定义了三种使用频次比较高的模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来的。...[] : $columns; $builder = $this->query->applyScopes(); $models = $builder->addSelect...$results = []; foreach ($relations as $name => $constraints) { //如果$name是数字索引
Laravel 自带的 软删除功能 就利用全局作用域从数据库中提取「未删除」的模型。编写自定义的全局作用域可以提供一个方便、简单的方法来确保给定模型的每个查询都受到一定的约束。...public function apply(Builder $builder, Model $model) { return $builder->where('age', '>'...使用渴求式加载,即根据预先需求查询出所有数据 为了验证[渴求式加载]的好处,举下列例子 这里用到了Laravel Debugbar 调试 安装方法可参照我的另一个博客 - - - Laravel...= 1; } 关联数据计数 如果你只想统计结果数并不需要加载数据,那么可以使用withCount方法,此方法会在你的结果集模型中添加一个{关联名_count}字段 如查询每个用户的号码数量 public..."country_id" => 2 "countrie_count" => 1 "phone_count" => 2 ] 你还可以为关联数据计数字段取别名
我们从软删除的使用,再顺便说一说模型内的作用域的概念。 代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。...在laravel中, 这个软删除字段默认是 deleted_at。你也可以在模型中手动指定。...$query->update($columns);} 为了说明问题,我们把中间几行代码都省略了。...Contact extends Model{ public function scopeStatus($query, $status) { return $query-...写在最后 本文从laravel模型的写操作删除动作,讲到了软删除的概念。进而引申出来本地作用域和全局作用域的使用。软删除几乎贯穿了我们应用的始终,需要大家勤学苦练。
引言 本期继续我们的laravel学习,主要说一说laravel使用eloquent orm 模型 读取数据库条目的几个常用方法。 ?...因为设计的原因,laravel支持的链式操作 本质上方法的返回值归属于不同的类。所以在使用方法之前务必明确调用的是哪个类的那个方法,返回的是什么类型的数据。...学习时间 让我们从最简单的例子开始,就是获取数据库表内所有的条目,返回一个集合。...eloquent门面为我们提供了很多好用的链式操作方法, 在query builder筛选出合适的条目后,返回一个eloquent collection,或者是一个 基类的collection对象,可以直接使用集合的方法操作数据集...比如常用的数据统计,计数,求平均,求和等等等等,laravel调用起来的方法也极为简单, 像下面这样: $countVips = Contact::where('vip', true)->count()
本文是orm系列的第三篇,也是Eloquent演化的第二篇,Eloquent系列会尝试着讲清楚Eloquent是如何一步一步演化到目前功能强大的版本的,但是毕竟个人能力有限,不可能分析的非常完善,总会有不懂的地方...Blueprint和Builder,Schema/Builder负责提供数据库操作的面向对象似的操作,而Schema/Blueprint则负责存储具体的操作数据,包括数据库操作的命令和数据库表的定义,因此有下面的结构...首先是morphMany的构造函数: public function __construct(Builder $query, Model $parent, $morphName) { $this...依赖PHP_FIG的建议,将框架组件独立开发并命名为Illuminate,再提供Starter Package让框架使用者可以透过composer建立项目,因此我们从eloquent-v4.0.0开始,...Manager,记得网上搜索过关键字Using Eloquent outside Laravel,我们可以看到一篇Vivek Kumar Bansal写的文章,文章从2方面介绍了怎么使用Eloquent
这次打算改造搜索能力,使用的是meilisearch,这是一个新出来的家伙,还不错! ?...前言 Laravel官方已经有scout+meilisearch 的一键扩展包 见:https://packagist.org/packages/laravel/scout 但是,肯定是不支持5.8版本的...}); // dd($docs); $this->ml->update($this->indexName, $docs); } /** * 从索引中移除给定模型...{ Log::info('search'); return $this->ml->search($this->indexName, $builder->query, $size...php artisan scout:import "App\Model\Admin\Article" 使用artisan命令就行,自带的哟!
Eloquent ORM 本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的系列请查看orm 基础环境的搭建 记录下怎么用docker搭建laravel的环境 新建项目composer...于是就可以通过设置Sequel Pro进行连接了,如下图所示 下一步是phpstorm的设置,可以参考文章如何使用PhpStorm實現TDD、重構與偵錯然后再是让如何在PhpStorm活用PHPDoc?...通过Eloquent的Scheme Builder构建数据库 通过使用Schema Builder我们可以在设计数据库的时候,不写一行sql,通过Schema Builder,我们可以 creating...Builder Schema Builder Schema Builder让我们可以不写一行sql语句,就能完成数据库的设计,下面让我们通过几个例子来看Schema Builder的使用,从最简单的表创建开始...总结 本文主要是介绍了使用docker来构建laravel的开发环境,同时,我们也介绍了怎么说会用phpstorm来开发laravel,搭建好环境后,主要介绍了Eloquent的Schema Builder
而我们在日常的操作中,其实最习惯的是使用数组那种形式的操作,除开我们后面会讲的直接从配置入手来修改 PDO FETCH 属性之外,我们还可以用上面这个 map() 函数配合模型对象的 attributesToArray...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。...但是,这里划重点了,Eloquent\Builder 中有些方法是没有的,比如说 insert()、insertGetId() ,在模型中,使用 save() 就可以代替这两个方法的操作。
书籍基于Laravel4的,学习时使用Laravel5.2框架开发。...不过有时也推荐使用它的Query Builder查询构造器,实际上就是SQL语句封装的类,性能会比较高一些,个人遇到过一个场景:使用Eloquent ORM性能有点慢,导致PHP执行过长报503 Time...Out,改成Query Builder后性能高很多脚本执行很快搞定,当然各有利弊,毕竟Eloquent很强大很好用。...Query Builder的where()方法,并传入Input::get('link')参数验证数据表里是否已经有该链接,并链式使用first()方法取出第一个结果: $link = Link...newHash = Str::random(6)创建一个包含数字字母的字符长度为6的字符串,再去表里验证该newHash是唯一的,这样比较麻烦,可以直接使用Hash::make( else{ $
继续介绍 Laravel Eloquent 的小技巧 11....$builder) { $builder->orderBy('name', 'asc'); }); } 这里还有更多关于请求范围作用域的介绍。...因此,如果您需要检查受影响的行数,则无需再调用任何其他方法 - update()方法将为你返回这个数字。 19....正确的方法稍微有些复杂,需要用到闭包函数作为子查询: $q->where(function ($query) { $query->where('gender', 'Male')...->where('age', '>=', 65); }) 20 orWhere方法使用更多参数 最后一条,你可以个 orWhere 方法传递一个数组。
它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。...Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。...使用MVC架构,能够优雅的进行开发! Laravel 安装说明 Laravel 使用 Composer 来管理项目依赖。...因此,在使用 Laravel 之前,请确保你的机器已经安装了 Composer。...例如, laravel new blog 将会创建一个名为 blog 的目录,并已安装好 Laravel 所有的依赖项: laravel new blog 在PHPStorm中配置,使其更好的支持Laravel