提供了一个方便的接口来创建及运行数据库查询语句,开发者在开发时使用QueryBuilder不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优雅。...); $statement->execute(); return $statement->fetchAll(); }); 直到getPdoForSelect这个阶段Laravel...通过梳理流程我们知道: Laravel是在第一次执行SQL前去连接数据库的,之所以$pdo一开始是一个闭包因为闭包会保存创建闭包时的上下文里传递给闭包的变量,这样就能延迟加载,在用到连接数据库的时候再去执行这个闭包连上数据库...到这里QueryBuilder大体的流程就梳理完了,虽然我们只看了select一种操作但其实其他的update、insert、delete也是一样先由QueryBuilder编译完成SQL最后由Connection...实例去执行然后返回结果,在编译的过程中QueryBuilder也会帮助我们进行防SQL注入。
if (config('database.enableQueryLog')) { DB::listen( function ($sql...) { foreach ($sql->bindings as $i => $binding) { if ($binding...instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Y-m-d H..., array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings);...$sql->time . ' 毫秒 ', [ '链接名称' => $sql->connectionName,
Laravel 默认只在sql语法错误时提示完整的sql日志,但实际情况接口慢,筛选条件和预期不符等,都需要看到sql语句,通过sql语句判断问题所在 下面介绍实现方式 第一步 修改 AppServiceProvider.php.../', (string) $value, $sql, 1); } $sql = sprintf('【%s】 %s...', $this->format_duration($query->time / 1000), $sql); Log::channel('sql')->debug($sql...'s'; } } 第二步 修改 config/logging.php 增加sql日志开关 /** * 开启sql日志 */ 'enable_log_sql'...=> env('LOG_SQL_ENABLED', true), 日志默认输出到 storage/logs/laravel.log文件,为了区分开,增加以下配置 'sql'
laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。 但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。...比如有一个查询条件: $publishedEvents = Event::where('published', '=', 1)->get(); 上述代码最后生成的SQL语句如下: SELECT * FROM...不过就是QueryBuilder的一个属性数组的一个元素而已,手动移除就行了,这样特例问题就解决了。...', 1); } 只需要声明一个以 scope 为首的小驼峰命名的函数方法即可,并返回一个 QueryBuilder 对象实例。...既然本地作用域返回的是 QueryBuilder 实例,那么自然就可以链式调用本地作用域的方法,和 QueryBuilder 的方法。
votes = 1'); DB::delete('delete from posts'); }, 5); https://learnku.com/docs/laravel
在laravel 框架中,一般使用链式操作来对数据库进行相关的增删改查。那么如何查看我们执行的sql 呢?...对于查询语句来说; 我们可以在链式操作后面加上->toSql();来打印执行的sql 语句。 但是,对于其他的就不适用了。..."bindings": [ "2020-05-27 17:34:48", 1 ], "time": 68.87 } 可以看到,框架为我们做好了sql
发现好多小伙伴调试代码时对 sql 打印不方便,特整理怎么实时在日志文件中打印所执行的 sql 语句 1、在 Listeners 目录新建 QueryListener.php 文件 代码如下: sql); $log = vsprintf($sql, $event->bindings); $this->put_log...$content; @file_put_contents(storage_path('logs/sql/' . $file . '-' ....php namespace App\Providers; use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;...语句就能在 storage/logs/sql 看到生成的 sql 日志了 app('db')->where('id', '>', '5')->get();
通过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...; use Spatie\QueryBuilder\AllowedFilter; public function index(Request $request, Topic $topic) {...php namespace App\Http\Queries; use App\Models\Topic; use Spatie\QueryBuilder\QueryBuilder; use Spatie...\QueryBuilder\AllowedFilter; class TopicQuery extends QueryBuilder { public function __construct
最后输出的 SQL 语句中,join 后面就会有多个条件。...compileUpdate() 很明显地是在组织 SQL 语句,大家也可以直接过去看看,它在 laravel/framework/src/Illuminate/Database/Query/Grammars...use Illuminate\Database\Query\Builder as QueryBuilder; // laravel/framework/src/Illuminate/Database/...Connection.php public function query() { return new QueryBuilder( $this, $this->getQueryGrammar...(), $this->getPostProcessor() ); } 注意这个 QueryBuilder 实际上是 use Illuminate\Database\Query\Builder
应用场景 某些SQL语句需要加某些共同的条件,例如status > 0,如果我们每条SQL语句都加的话显然是很麻烦的,作为一个优雅的框架,当然有相应的解决办法 编写作用域 Laravel 应用默认并没有为作用域预定义文件夹...StatusScope()); } } 添加作用域后,如果使用 ScopeTest::all() 查询则会生成如下 SQL
而laravel提供了非常好的 debug 支持,只需在 env 文件内指定 debug = true ,就可以在页面打开 debug bar 用于调试。 ?...其中也包含有Query选项,列出了程序加载流程中所有调用的SQL语句,这非常方便。 如果在没有debug,或者没有 blade 模板渲染的页面,如何获取 ORM 组装出来的SQL语句呢?...还有一种方法,就是链式调用 QueryBuilder 的 toSql 方法,即可打印当前模型的SQL语句,而并不执行。...DB::table('users')->toSql() 上述方法输出的结果: select * from `users` 当然只要是返回的 QueryBuilder 对象,均可使用。...但是 toSql 获取的只是带参数绑定的SQL,不打印参数。
引言 鉴于上一章标题引起一些开发同学的巨大兴趣,本文我们接着此种行文方式继续我们的“Laravel宇宙”系列文章。...为了演示查询构造器的功能用法,我们直接使用 DB 门面创建 QueryBuilder 对象。...我们引入查询构造器,引入模型,就是为了摆脱繁杂的SQL语法,这里又传入原生语句,不提倡!...,[true]); 为了编程愉悦感,还是回归我们的laravel推荐的链式操作的方式来演示更多更复杂的功能。...写在最后 本文轻描淡写地讲解了laravel中的查询构造器,讲了一个比较复杂的OR查询,因为使用闭包组装WHERE约束条件,所以会有些难以理解, 不过对比打印生成的SQL语句后,大家应该会豁然开朗!
通过更新文章自己在软件设计、文字表达方面都有所提高,在刚开始决定写Laravel源码分析地文章的时候我地期望是自己和读者通过学习Laravel核心的代码能在软件设计上带来提高,这些提高主要是指两方面:...通过学习Laravel核心的代码来辅助理解软件设计行业中经常提及的核心概念,通过学习像IocContainer、面向对象的五大原则SOLID 是怎么应用到框架设计中去的来指导应该如何去做软件开发设计。...这方面对你的收益应该是跳出Laravel框架和PHP语言层面的,当你需要切换到其他框架和语言时这些收益仍会反馈给你。...Laravel整个框架设计到的内容有很多,其他的组件我也就不再一一去写文章梳理了, 相信你在认真看完这个系列的文章后,假如你在使用其他组件过程中遇到了诡异的问题,或者好奇框架是怎么帮你实现功能的?...类地反射和依赖注入 IocContainer 服务提供者 Facades Route Middleware 控制器 Request Response Database基础 QueryBuilder 模型
EloquentModel, Eloquent是建立在 DB的查询构建器基础之上,对数据库进行了抽象的 ORM,功能十分丰富让我们可以避免写复杂的SQL语句,并用优雅的方式解决了数据表之间的关联关系。...config); //设置time zone $this->configureTimezone($connection, $config); //为数据库会话设置sql...public function query() { return new QueryBuilder( $this, $this->getQueryGrammar...DatabaseManager代理的数据库连接对象了, 所以最开始执行的代码 DB::table('users')->get()经过我们上面讲的历程,最终是由Connection来完成执行的,table方法返回了一个QueryBuilder...对象,这个对象里定义里那些我们经常用到的 where, get, first等方法, 它会根据调用的方法生成对应的SQL语句,最后通过Connection对象执行来获得最终的结果。
引言 我们推荐使用laravel的eloquent orm 模型操作数据库表, 因为特性更为丰富,组装更为灵活,在编程层面操作数据的来来去去非常直观。...先说查询语句, 如果在数据库优化上做的比较好的一些SQL固定写法,可以使用原生方法固化下来。...扩展一下,带有查询条件的SQL原生语句, 为了防止SQL注入,使用参数绑定的方式: $usersOfType = DB::select('select * from users where type =..., [1]); 写在最后 本文通过对laravel DB门面的增删改查用法,向大家展示了基本的参数绑定的用法。...一般我们不推荐使用原生SQL语句操作数据库,提倡大家把数据库操作集中到模型层, 充分利用eloquent orm的性能。
laravel/framework/src/Illuminate/Collections/Collection.php 是集合类,里面的方法大部分都调用的是 laravel/framework/src/...getConnection() 会返回一个之前讲过的工厂方法创建的 Connection 对象,而 query() 方法则会根据 Connection 创建一个 QueryBuilder 对象。...不过这里需要注意的是,模型默认生成的 QueryBuilder 是 llaravel/framework/src/Illuminate/Database/Eloquent/Builder.php 对象,...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...参考文档: https://learnku.com/docs/laravel/8.x/eloquent/9406
学习时间 对于数据库DBA可能更习惯从SQL的角度出发,从SQL现有的语言结构和功能上解决问题。...写多了容易无解,直接上SQL: ? 大家注意那个 IN 子句,其实是一个查询结果集,从另个表返回的。 写SQL真的很伤神,不如用框架自带的orm,操作起来非常人性化,拼装也很简单。...那就抛出一个问题,Laravel如何实现上述的子查询? 对Laravel来说,简直不要太简单,你只要在写whereIn的时候,将数组使用闭包返回就可以了。...写在最后 本文通过一个SQL语句查询在Laravel中的实现方式,解释了laravel在拼装SQL查询时的自由度,使用起来非常灵活。...对于固定的查询方式,或者经过优化的SQL语句,你大可直接发送给Laravel直接运行以便提高效率。
sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1.mp4...word2.mp4', 'Word基本界面'), (3, 'word', 'word3.mp4', 'Word新建'), (4, 'word', 'word4.mp4', 'Word保存'); 我需要的Laravel
引言 laravel使用模型进行数据库操作时,并不是所有的字段或者关联关系 都能满足查询需求,有时候会有一些MySQL的函数计算等功能放在数据库 层面执行。 本文说一说自定义的参数绑定办法。...最重要就是 setBindings 方法了,传送的是前面自定义SQL语句的位置参数。只需一一对应上就可以了。...如果大家经常使用laravel的调试功能的话,应该会注意到,这种问号的写法是laravel本身封装SQL语句用的。...))*sin(radians(lat)))) AS distance SQL; 首先拼装好SQL语句的字段,然后使用laravel模型的方法: $property = Property::selectRaw...lng, $lat])->having('distance', 'orderBy('distance')->take(20)->get(); 写在最后 本文通过三种方式实现了laravel