首页
学习
活动
专区
圈层
工具
发布

【Laravel系列4.2】查询构造器

其实就像我们上篇文章中学习过的使用原始 SQL 语句的方式来操作数据库一样,查询构造器这个东西就是在这个原始操作的基础上为我们封装了一系列的接口,能够让我们方便地来操作数据库。...当然,要使用哪种一般会是团队的选择,而且往往更多情况下是 查询构造器 和 模型 两个结合起来使用。 好了,话说回来,我们还是看看代码。...大家可以看到,在代码中我还使用了一个 toArray() 结尾,这样返回的就是一个数组。如果在没有做其它设置的情况下,这个数组里的每一项会是一个 stdClass 对象。...我们又发现了一个设计模式在 Laravel 框架中的应用,意外不意外,惊喜不惊喜! 连表查询 普通的连表查询的使用还是非常简单的,我也就不多说了,下面的代码中也有演示。...而且更重要的是,我们也确认了 查询构造器 确实在底层还是使用的 原始SQL 的方式执行的。同时,我们也找到了构造器创建的地方。依然是收获满满的一天呀。

18.8K10

3分钟短文:Laravel模型作用域,为你“节省”更多代码

laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。 但是久而久之,随着项目的需求不断扩大,最常用的查询操作,同样会有大量的冗余代码。...全局作用域 假设有些数据库查询操作,无论是在控制器内,或者在模板文件内,或者命令行方法内,都有重复的使用需求,要是在模型内有一个公用的方法,默认就加上这些筛选条件,就可以显著减少代码量了。...events WHERE `published` = 1; 如果条件 published = 1 在默认的情况下需要开启,我们可以使用laravel模型的 全局作用域 方式为所有查询追加上这个条件。...不过就是QueryBuilder的一个属性数组的一个元素而已,手动移除就行了,这样特例问题就解决了。...比如有这样一个查询需求: $events = Event::where('zip', $zipCode)->get(); 使用本地作用域实现出来: public function scopeZip($query

1.8K22
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Laravel源码解析之QueryBuilder

    Database 查询构建器 上文我们说到执行 DB::table('users')->get()是由Connection对象执行table方法返回了一个QueryBuilder对象,QueryBuilder...提供了一个方便的接口来创建及运行数据库查询语句,开发者在开发时使用QueryBuilder不需要写一行SQL语句就能操作数据库了,使得书写的代码更加的面向对象,更加的优雅。...is_array($column)) { return $this->addArrayOfWheres($column, $boolean); } // 当这样使用where...$this->columnize($columns); } //将QueryBuilder $columns字段数组转换为字符串 public function columnize(array $columns...然后在compileSelect方法里将这个由查查询语句里每部份组成的数组转换成真正的SQL语句: protected function concatenate($segments) { return

    2.3K50

    3分钟短文 | Laravel 获取模型查询生成的SQL语句

    而laravel提供了非常好的 debug 支持,只需在 env 文件内指定 debug = true ,就可以在页面打开 debug bar 用于调试。 ?...学习时间 比如有一个原始的查询: DB::table('users')->get(); 它生成的SQL语句是 SELECT * FROM users 那么在程序上下文中,应该如何获取并打印这个SQL语句呢...还有一种方法,就是链式调用 QueryBuilder 的 toSql 方法,即可打印当前模型的SQL语句,而并不执行。...DB::table('users')->toSql() 上述方法输出的结果: select * from `users` 当然只要是返回的 QueryBuilder 对象,均可使用。...所以使用where子句查询后,直接打印较为方便。 但是 toSql 获取的只是带参数绑定的SQL,不打印参数。

    4.1K20

    Laravel 权限控制新选择:使用 Laravel-authz 集成 PHP-Casbin

    安装包使用 Composer 安装 Laravel-authz:composer require casbin/laravel-authz包安装后,ServiceProvider 和 Facade 会自动注册...基本使用管理权限和角色使用Enforcer门面可以轻松管理权限和角色:use Enforcer;// 给用户添加权限Enforcer::addPermissionForUser('eve', 'articles...重写Gate行为开发者可以使用 Laravel 的 Gates 检查一个用的权限:$user->can('articles,read');// For multiple enforcers$user->...artisan policy:add writer,articles,edit# 给用户赋予角色php artisan role:assign eve writer性能优化建议在生产环境中,可以考虑以下优化措施:使用策略缓存中间件预加载策略实现批量检查优化减少数据库查询监控缓存命中率和平均鉴权耗时设置灾备方案防止单点故障总结...通过它可以轻松实现:多种访问控制模型:支持 ACL、RBAC、ABAC 等模型无缝集成:与 Laravel 原生 Auth 系统深度整合高性能:支持缓存和多种优化策略易于使用:提供友好的 API 和 Artisan

    30410

    【Laravel系列4.4】模型Eloquent ORM的使用(二)

    比如说我们可以使用类似于 array_map() 的函数把集合中的对象全部转换成数组,还可以用一个类似于 array_column() 的函数只获取数据中的两个字段组成键值对形式的数据。...而另外一个 map() 函数就不用多说了,之前我们说过,Laravel 的 PDO 在默认查询构造器的情况下,走的是 PDO::FETCH_OBJ ,获得的集合结果中的每个数据都是一个 stdClass...而我们在日常的操作中,其实最习惯的是使用数组那种形式的操作,除开我们后面会讲的直接从配置入手来修改 PDO FETCH 属性之外,我们还可以用上面这个 map() 函数配合模型对象的 attributesToArray...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...说白了,直接 mTest->insert() 是会报错的,不过也有方法解决,只不过那样就完全像是使用一个 查询构造器 了,大家自己找找解决方案哦。

    4.8K20

    在 Laravel Eloquent 模型类中使用作用域进行查询

    问题引出 在通过 Eloquent 模型实现增删改查这篇教程中,我们已经学习了如何在 Eloquent 模型类中进行各种查询,但是这些查询大多需要手动调用查询构建器提供的各种方法来实现。...接下来,我们就来演示如何在 Eloquent 模型类上使用「作用域」进行查询。...class])->get(); # 移除多个类/匿名函数 局部作用域 「全局作用域」虽然强大,但不够灵活,有的时候我们的预置过滤器可能因不同场景而已,不同场景需要不同的预置过滤器,这个时候就不能使用...推荐使用这种方式来构建需要在多个场景调用的复杂 Eloquent 查询。 移除局部作用域很简单,不要在查询中指定对应的过滤器方法即可。...本系列教程首发在Laravel学院(laravelacademy.org)

    3.6K20

    Laravel源码学习文章汇总

    通过更新文章自己在软件设计、文字表达方面都有所提高,在刚开始决定写Laravel源码分析地文章的时候我地期望是自己和读者通过学习Laravel核心的代码能在软件设计上带来提高,这些提高主要是指两方面:...熟练掌握Laravel的使用,虽然很多人说框架只是一个工具不应该花太多时间在工具的研究上,但是现实时开发者群体大部分人并没有在头部的那几家大公司,也不架构师,我们多数的工作还是在写业务代码,那么既然你需要...),知道怎么使用ORM才能让查询更高效等等,这些内容往往在框架的文档都是很少提及的,需要去看源码了解一下,如果你只会文档里提到的那些典型的用法显然不能算是熟练掌握的。...Laravel整个框架设计到的内容有很多,其他的组件我也就不再一一去写文章梳理了, 相信你在认真看完这个系列的文章后,假如你在使用其他组件过程中遇到了诡异的问题,或者好奇框架是怎么帮你实现功能的?...类地反射和依赖注入 IocContainer 服务提供者 Facades Route Middleware 控制器 Request Response Database基础 QueryBuilder 模型

    1.1K10

    3分钟短文:Laravel查询构造器,告别手写SQL的艰苦岁月

    引言 鉴于上一章标题引起一些开发同学的巨大兴趣,本文我们接着此种行文方式继续我们的“Laravel宇宙”系列文章。...为了演示查询构造器的功能用法,我们直接使用 DB 门面创建 QueryBuilder 对象。...写一条不附加任何约束条件的查询: $users = DB::table('users')->get(); 还有复杂的多表联合查询,使用 INNER JOIN 方式: DB::table('users')...Carbon::now()->subDay())->get(); 复杂的查询莫过于使用多表联合查询,使用子查询,使用比较绕的or查询,我们对or查询举两个例子, 大家在调试的时候,一定要对自己写的代码打印一下最终生成的...写在最后 本文轻描淡写地讲解了laravel中的查询构造器,讲了一个比较复杂的OR查询,因为使用闭包组装WHERE约束条件,所以会有些难以理解, 不过对比打印生成的SQL语句后,大家应该会豁然开朗!

    1.7K10

    GreenDao查询,Querying

    查询接口返回符合指定条件的实体对象集合.你可以使用SQL组织你的查询语句,或者采用更好的方法,使用greenDao的QueryBuilder API.greenDao的查询也支持延迟加载结果,当结果集很大的时候....当你使用QueryBuilder中的一个方法来获取结果(如一个list()方法),QueryBuilder内部使用Query类.如果你要以相同的条件多次查询,你可以调用QueryBuilder的build...进行多次查询 一旦你使用QueryBuilder构造了一个query,这个query对象后续可以重复使用,来执行查询.这比总是创建新的Query对象要更有效.如果查询条件没有变,你只需要再次调用其中一个...QueryBuilder构造Query的参数一致. 5.原始查询 获取数据,有两种方法来执行原始的SQL.比较好的方法是使用QueryBuilder和WhereCondition.StringCondition...没有提供你需要的特性时(例如上面的join关键字),你可以回到原始的查询语句或者原始查询语句的构造方法.他们允许传入原始SQL字符串,追加到SELECT + 实体列名后面.通过这种方法,你可以拼好任意WHERE

    38200

    3分钟短文:Laravel查询构造器,告别手写SQL的艰苦岁月

    引言 鉴于上一章标题引起一些开发同学的巨大兴趣,本文我们接着此种行文方式继续我们的“Laravel宇宙”系列文章。...为了演示查询构造器的功能用法,我们直接使用 DB 门面创建 QueryBuilder 对象。...写一条不附加任何约束条件的查询: $users = DB::table('users')->get(); 还有复杂的多表联合查询,使用 INNER JOIN 方式: DB::table('users')...Carbon::now()->subDay())->get(); 复杂的查询莫过于使用多表联合查询,使用子查询,使用比较绕的or查询,我们对or查询举两个例子, 大家在调试的时候,一定要对自己写的代码打印一下最终生成的...写在最后 本文轻描淡写地讲解了laravel中的查询构造器,讲了一个比较复杂的OR查询,因为使用闭包组装WHERE约束条件,所以会有些难以理解, 不过对比打印生成的SQL语句后,大家应该会豁然开朗!

    2.2K11

    Laravel源码解析之Database

    在我们学习和使用一个开发框架时,无论使用什么框架,如何连接数据库、对数据库进行增删改查都是学习的重点,在Laravel中我们可以通过两种方式与数据库进行交互: DB, DB是与PHP底层的 PDO直接进行交互的...,通过查询构建器提供了一个方便的接口来创建及运行数据库查询语句。...Database服务注册和初始化 Database也是作为一种服务注册到服务容器里提供给Laravel应用使用的,它的服务提供器是 Illuminate\Database\DatabaseServiceProvider...mysql,这里假定是常用的mysql连接 return $this->app['config']['database.default']; } 如果没有指定连接名称,Laravel会使用database...详细内容我们等到以后讲查询构建器的时候再看。

    1.7K30

    商城项目-生成规格参数过滤

    如果用户尚未选择商品分类,或者聚合得到的分类数大于1,那么就没必要进行规格参数的聚合。因为不同分类的商品,其规格是不同的。...因此,一旦商品分类确定,我们就可以根据商品分类查询到其对应的规格,从而知道哪些规格要进行搜索。 要过滤的参数,其可选值是如何获取的?...虽然数据库中有所有的规格参数,但是不能把一切数据都用来供用户选择。 与商品分类和品牌一样,应该是从用户搜索得到的结果中聚合,得到与结果品牌的规格参数可选值。...3.3.3.获取需要聚合的规格参数 然后,我们需要根据商品分类,查询所有可用于搜索的规格参数: ?...3.4.页面渲染 3.4.1.渲染规格过滤条件 首先把后台传递过来的specs添加到filters数组: 要注意:分类、品牌的option选项是对象,里面有name属性,而specs中的option是简单的字符串

    1K10

    商城项目-生成分类和品牌过滤

    显然不是,用户搜索的条件会对商品进行过滤,而在搜索结果中,不一定包含所有的分类和品牌,直接展示出所有商品分类,让用户选择显然是不合适的。...因为索引库中只有id,所以我们根据id聚合,然后再根据id去查询完整数据。 所以,商品微服务需要提供一个接口:根据品牌id集合,批量查询品牌。...1.1、基本查询 queryBuilder.withQuery(QueryBuilders.matchQuery("all", request.getKey())); /...所以,我们可以把所有的过滤条件放入一个数组中,然后在页面利用v-for遍历一次生成。...其基本结构是这样的: [ { k:"过滤字段名", options:[{/*过滤字段值对象*/},{/*过滤字段值对象*/}] } ] 我们先在data中定义数组

    69110

    3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错!

    引言 Laravel 提供了 Eloquent ORM 对象用于操作数据库,将其进行抽象方便操作。 ?...因为设计的灵活度,大家在使用Model查询数据集的时候,会面临结果为空,记录不存在的问题, 那么如何有效地判断查询记录为空呢?本文就带大家深入了解一下。...代码可以这样写: $user = User::where('email', '=', Input::get('email')); 那么问题来了,上述 $user 变量返回的其实是一个 QueryBuilder...user = User::where('email', '=', Input::get('email'))->first(); if ($user === null) { // 不存在 } 如果使用聚合查询...那么使用邮箱号查询的结果,就可以仅取一条,这样我们使用 first 方法,返回一个 User 对象,或者 null, 然后判断 $user 是否是空,如果空,就是没有邮箱不存在;如果有结果,那就是 User

    1.2K10
    领券