引言
本期继续我们的laravel学习,主要说一说laravel使用eloquent orm 模型 读取数据库条目的几个常用方法。
因为设计的原因,laravel支持的链式操作 本质上方法的返回值归属于不同的类。 所以在使用方法之前务必明确调用的是哪个类的那个方法,返回的是什么类型的数据。
学习时间
让我们从最简单的例子开始,就是获取数据库表内所有的条目,返回一个集合。使用下面的方法即可实现:
$allContacts = Contact::all();
通过查看源码我们知道all方法,其实是调用了 get 方法并默认返回所有字段。 我们为这个查询添加条件,一遍精简输出内容:
$vipContacts = Contact::where('vip', true)->get();
筛选出所有vip的合约。eloquent门面为我们提供了很多好用的链式操作方法, 在query builder筛选出合适的条目后,返回一个eloquent collection,或者是一个 基类的collection对象,可以直接使用集合的方法操作数据集:
$newestContacts = Contact::orderBy('created_at', 'desc')->take(10)->get();
不过大家需要注意的是,orderBy take 这些方法,都是集合的操作,也就是说 在执行之前,数据库查询是全量的,这对于数据库服务器和web服务器不再一台主机的情况, 网络传输量是个不小的考验。
所以我们推荐使用where语句进行数据库SQL操作,将合适的结果集返回,这样精简了数据库负载, 再者,使用集合的操作方法,对结果集进行进一步的格式化,效率会高的多。
对于web应用,可以简单地使用前几期我们使用的 firstOrFail 方法,便捷地去除第一个条目, 或者找不到的时候,抛出异常。
public function show($contactId){ return view('contacts.show')->with('contact', Contact::findOrFail($contactId));}
其中,first(), firstOrFail(), find(), findOrFail(),都是用于返回单个条目,单条记录的方法。
如果返回的是多个条目,就不能用这些方法了:
$vipContacts = Contact::where('vip', true)->get();
有一个标准的方法 get,就是返回一个 eloquent collection 对象。如果你的数据库条目固定, 且是少量数据,那么直接用
$contacts = Contact::all();
把记录全部拿出来就好了。如果数据量有点大,要分批次将结果返回, 但是又不知道总量多少,则可以使用分块返回的方式,手动指定每次查询的条目数, 依次将结果集拿出来:
Contact::chunk(100, function ($contacts) { foreach ($contacts as $contact) {}});
只需调用chunk方法,就能帮你办到。
顺带再说一下聚合函数,使用关系型数据库很大的因素就是其拉取关系型数据很高效, 因此也内置了很多聚合函数用于数据聚合操作。
比如常用的数据统计,计数,求平均,求和等等等等,laravel调用起来的方法也极为简单, 像下面这样:
$countVips = Contact::where('vip', true)->count();$sumVotes = Contact::sum('votes');$averageSkill = User::avg('skill_level');
当然了,现实场景一般都要有查询约束条件,我们只用链式调用, 在完成约束后,使用聚合函数统计即可。
写在最后
本文主要讲了数据库查询相关的内容,包括获取全量数据,获取单条数据, 分块拉取数据,以及聚合函数等,这些常规操作集合上期讲的查询约束项, 基本上可以涵盖编程中的大多数需求了。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。