Grammar将会把Query Builder的fluent api编译成SQL,PDO编译执行该SQL语句得到结果集results,Processor将会处理该结果集results。...OK,那Query Builder是如何把书写的api编译成SQL呢?...编译API成SQL 还是以上篇说到的一行简单的fluent api为例: Route::get('/query_builder', function() { // Query Builder...该Builder还必须装载两个神器:Grammar SQL语法编译器;Processor SQL结果集后置处理器。...function processSelect(Builder $query, $results) { // 直接返回结果集,什么都没做 return $results
Grammar将会把Query Builder的fluent api编译成SQL,PDO编译执行该SQL语句得到结果集results,Processor将会处理该结果集results。...该Builder还必须装载两个神器:Grammar SQL语法编译器;Processor SQL结果集后置处理器。...function processSelect(Builder $query, $results) { // 直接返回结果集,什么都没做 return $results...Grammar将会把Query Builder的fluent api编译成SQL,PDO编译执行该SQL语句得到结果集results,Processor将会处理该结果集results。...function processSelect(Builder $query, $results) { // 直接返回结果集,什么都没做 return $results
说明:本文主要学习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
说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程。...开发环境:Laravel5.3 + PHP7 Builder::toSql() 看下toSql()的源码: public function toSql() { // $this...GrammarsGrammar::compileSelect(Builder query),看下compileSelect(Builder query)的源码: public function...OK, 总的来说,通过了解Query Builder的实现原理后,知道其并不复杂或神秘,只是一个对PDO更友好封装的包裹,Query Builder有几个重要的类或概念:连接类MySqlConnection...那Eloquent ORM又是什么,与Query Builder是什么关系呢?既然有了Query Builder,为何还提供了Eloquent ORM呢?
集合操作 其实这个集合操作并不是模型特有的,还记得在 查询构造器 中,我们查询列表的时候,总会在最后加一个 toArray() 吗?...而另外一个 map() 函数就不用多说了,之前我们说过,Laravel 的 PDO 在默认查询构造器的情况下,走的是 PDO::FETCH_OBJ ,获得的集合结果中的每个数据都是一个 stdClass...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。
在这里还需要注意的是,链式调用每个函数方法的返回值哦,只有返回的是 Builder 对象的才可以不停地链式哈,get()、toArray()、find() 之后可不能再继续链式了,因为它们返回的是结果对象...直接通过编辑器的跳转功能点击 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
开发环境:Laravel5.1+MAMP+PHP7+MySQL5.5 先写个店铺列表页 1.先装上开发插件三件套(具体可参考:Laravel5.2之Seeder填充数据小技巧) 不管咋样,先装上开发插件三件套...: 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
\Builder|\App\Post whereId($value) * @method static \Illuminate\Database\Query\Builder|\App\Post whereCategoryId...($value) * @method static \Illuminate\Database\Query\Builder|\App\Post whereTitle($value) * @method...Database\Query\Builder|\App\Post whereSummary($value) * @method static \Illuminate\Database\Query\Builder...\Database\Query\Builder|\App\Post wherePublished($value) * @method static \Illuminate\Database\Query...\Builder|\App\Post whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\App\Post
如下例 public function index(Request $request, Topic $topic) { $query = $topic->query();...if ($categoryId = $request->category_id) { $query->where('category_id', $categoryId);...->paginate(); return TopicResource::collection($topics); } 返回的结果 可以看到,除了返回文章相关数据外,还返回了用户相关数据...通过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
的数据操作分两种 – DB facade – Eloquent ORM 它们除了有各自的特色外,基本的数据操作都是通过 Illuminate\Database\Query\Builder 调用方法去完成整个...这个文件在你项目目录中的 vendor/laravel/framework/src/Illuminate/Database/Query 下,你可以自行去查看。...$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
在执行 update() 操作时,我们最后进入了 laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 这个对象中。...public function compileInsert(Builder $query, array $values) { // Essentially we will force every...接下来,我们再看一下 get() 方法,也就是获得查询结果集的方法。...public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) {...protected function compileComponents(Builder $query) { $sql = []; foreach ($this->selectComponents
前言 Laravel官方已经有scout+meilisearch 的一键扩展包 见:https://packagist.org/packages/laravel/scout 但是,肯定是不支持5.8版本的...流程 先安装scout composer require laravel/scout "v7.2.1" laravel 5.8 最多支持 scout "v7.2.1" 发布: php artisan...{ Log::info('search'); return $this->ml->search($this->indexName, $builder->query, $size..., $page); } /** * 返回给定搜索结果的主键 * * @param mixed $results * @return \Illuminate...$this->search($builder, $size, $page); } /** * 返回搜索结果总数 * * @param mixed $results
* * @param \Illuminate\Database\Eloquent\Builder $query * @param string...*/ public function scopeSort(Builder $query, $column, $direction) { if (!...* * @param \Illuminate\Database\Eloquent\Builder $query * @param array...(Builder $query, array $search = []) { if (empty($search)) { return $query;...我尝试debug进入where()函数看了看它内部的实现,src/Illuminate/Database/Query/Builder.php: public function where($column
composer install --ignore-platform-reqs # 安装项目模块, 忽略平台问题 设置应用密钥 php artisan key:generate 结果...cSs resources: 视图文件资源 routes: 应用定ssss义的所有路由 storage: 编译后blade模板,session,文件缓存...password']]); // 按需求添加数据 $res = User::create($input); // 添加数据 // 1.如果添加成功,跳转到列表页...forpage($page, $limit) ->orderby('create_at', 'desc') ->selectRaw("user.*") ->get(); 9.6 联表 $builder...= UserModel::query()->from('user AS u')->selectRaw('u.*'); $builderData = $builder->join('contract AS
Laravel中软删除数据的过滤也是使用这种方式实现的。...protected function performJoin(Builder $query = null) { $query = $query ?...$query, Builder $parentQuery, $columns = ['*']) { $query->from( $query->getModel()->getTable().' as...以上就是Laravel实现软删除的大概逻辑。这里有一个细节,Laravel中软删除的标记是一个时间格式的字段,默认delete_at。通过是否为null判断数据是否删除。...在这样的场景下,需要对Laravel的软删除进行修改才能够实现。
laravel框架自身并不携带验证码类,我这里采用开源的gregwar/captcha,来做验证码,并判断是否可以登录。...; //把内容存入session 存储验证码 $request->session()->flash('captchaSession', $phrase); //清除缓存...,但是并没有起作用,改用 ob_clean(); 去清除浏览器缓存。...->output(); 这样写,结果都会显示验证码图片。...->output(); 这样写,结果都会显示验证码图片。
laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。 但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。...$builder) { $builder->where('published', '=', 1); }); } 这样SQL语句 where published = 1 就会追加到所有的模型查询方法内...而声明一个本地作用域,只要遵循laravel的语法规定即可,如下示例: public function scopePublished($query) { return $query->where('published..., $zip) { return $query->where('zip', $zip); } 按照位置传入即可。...我们再声明一个本地作用域方法: public function scopeAttendees($query, $maximum) { return $query->where('max_attendees
经过一番调研之后发现了一个堪称神器的扩展:laravel-upsert 这个 Laravel 扩展为查询构建器和 Eloquent 添加了对 INSERT & UPDATE (UPSERT) 和 INSERT...//校验是否存储 public static function checkExist($userid, $otherUserid) { return self::query...function updateContactsType($userid, $otherUserid, $type, $appointmentPrepareId = 0) { self::query...Lumen 如果您使用 Lumen,则必须手动实例化查询构建器: $builder = new \Staudenmeir\LaravelUpsert\Query\Builder(app('db')->connection...()); $builder->from(...)
今天学院君来给大家演示如何在 Laravel 项目中基于 Redis 实现应用缓存功能,这想必也是很多人日常使用 Redis 最多的业务场景,这里的缓存指的是将数据库查询结果存储到 Redis,其目的是将数据加载从磁盘...正如前面所说,现在我们可以在资源库 PostRepo 这一层对数据库查询结果进行缓存,而不需要调整任何控制器代码。...(如果缓存项是对象,则通过 unserialize 方法对其做反序列化操作再返回); 若缓存项不存在,则先通过数据库查询获取结果,然后基于 Redis 的 SETEX 指令将其存储到 Redis(如果待缓存项是对象...,则通过 serialize 方法将其序列化为文本字符串,这里使用 SETEX 指令的原因是需要设置缓存过期时间),再返回数据库查询结果。...你可以到 Redis 命令行客户端去查看对应的缓存数据: 使用 Laravel 自带的缓存组件 当然,在 Laravel 项目中,如果使用 Redis 作为缓存存储器的话,推荐使用自带的缓存组件,在配置好
领取专属 10元无门槛券
手把手带您无忧上云