vlambda博客
学习文章列表

3分钟短文:Laravel 模型查询数据库的几个关键方法

引言

本期继续我们的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 :-)


我是@程序员小助手,持续分享编程知识,欢迎关注。