前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章来帮助那些还在学习的朋友们吧。 目录 dotnet core 和 .net的区别 github中dotnet core各个项目的状况 一、 dotnet core 和 .net的区别 目前在使用C#开发应用程序的时候,有两种框架可供选择: .Net Framework 和 .Net Core,那他们有什么不同的地方呢?或者说是微软为什么要做两个框架,在同一个平台上运行不好吗?就先让我们一起看看他们之间的不同。 大家都知道 .Net Core是跨平台的,除了运行在windows上之外,还可以运行在Linux和Mac OS上。而 .Net Framework只能运行在windows上或者借助于Mono运行于其他平台上。 .Net Core和 .Net Framework可以理解为一个子集和父集的关系,之所以 .Net Core带了个Core是因为它包含了 .Net Framework的一些核心的功能和特性,比如它们共享GC (Garbage Collection,垃圾收集,垃圾回收),jit(Just-In-Time )编译器,还有类型系统和语言特性等。 那么 asp.net 和 asp.net core 的区别呢? asp.net 目前的版本是asp.net 4.6,它已经被使用了很多年了,它比较稳定,如果你的系统不需要跨平台,只是在windows上运行的话,可以使用asp.net 4.6, 它很稳定并且很多第三方库都对其进行了支持。 asp.net core 是采用了 .net core的新一代asp.net架构程序。目前的版本是RC2。后面会对其进行大量介绍。 下面这张图就是他们之间的关系: 二、 github中dotnet core各个项目的状况 有一点值得我们开发者高兴的是,现在微软 .net 相关的大多数项目都是开源的,托管在github上,我建议大家有不懂的地方多去查看源代码,来了解其中的运行原理,以便于对知识的更好的理解和吸收。 .NET Compiler Platform ("Roslyn") .NET编译器。提供的开源Csharp和Visual Basic编译器及代码解析API .NET Core Framework 也被叫做CoreFx,提供Core的基础程序集类库,它包括collections, file systems, console, XML, async等. .NET Core Runtime 也被叫做CoreCLR,它包括了 .net core的runtime(运行时),和mscorlib(基础库),它包含的有GC(垃圾回收),JIT(just-in-time)编译器, 类型系统(.NET data types),和其他一些底层的类库。 […]
View Detailsdotnet的镜像:https://hub.docker.com/r/microsoft/dotnet/,如下图: 下面就演示一下怎么跑一下示例程序,用意是抛砖引玉。 1.首先拉一下镜像:docker pull microsoft/dotnet;命令在仓库首页的右上角。下载慢的同学可以使用阿里的加速器。 2.用官方的例子创建镜像:
|
1 2 3 4 5 6 7 |
docker run -p 8000:80 -e "ASPNETCORE_URLS=http://+:80" -it --rm microsoft/dotnet [now in the container] mkdir app cd app dotnet new mvc dotnet restore dotnet run |
退出容器用exit命令。以上命令创建的是一个临时镜像,当然你想创建持久化的镜像可以把“--rm”删除。 3.运行过以上命令,这时访问宿主的8000端口就可以访问Asp.Net Core的示例网站了;结果如图:
View DetailsPDO一是PHP数据对象(PHP Data Object)的缩写。 并不能使用PDO扩展本身执行任何数据库操作,必须使用一个database-specific PDO driver(针对特定数据库的PDO驱动)访问数据库服务器。 PDO并不提供数据库抽象,它并不会重写SQL或提供数据库本身缺失的功能,如果你需要这种功能,你需要使用一个更加成熟的抽象层。 PDO需要PHP5核心OO特性的支持,所以它无法运行于之前的PHP版本。
View DetailsPython 由于本身的易用优势和强大的工具库储备,成为了在人工智能及其它相关科学领域中最常用的语言之一。尤其是在机器学习,已然是各大项目最偏爱的语言。 其实除了 Python ,也不乏有开发者用其他语言写出优秀的机器学习项目。在上期的文章中(除了 Python ,这些语言写的机器学习项目也很牛(一)),我们已经列了一些其他语言(C、C++、Go、Java、Javascript)值得关注的开源机器学习项目,本期将针对 PHP、Ruby、Objective C、Swift、Scala 进行补全,同时应上期留言要求,在文末列了一些 .NET 平台上的机器学习项目。 1、PHP PHP-ML —— 机器学习库 PHP-ML 是 PHP 的机器学习库,同时包含算法、交叉验证、神经网络、预处理、特征提取等多种特性。要求 PHP 版本 > = 7.0 。 PHP-ML 提供的机器学习算法包括:关联规则学习(Apriori 算法)、分类器(SVC、KNN、贝叶斯)、回归(最小二乘线性回归、支持向量回归)、聚类(KMeans、基于密度的聚类算法)、矩阵运算相关(准确率、混肴矩阵、与分类相关的结论如精确度、召回率、F1 值、支持率)、模型运算管道(Pipeline)、神经网络(多层感知机)等。 2、Ruby Treat ——自然语言处理框架 Treat 是一个自然语言处理和计算语言学的工具包。Treat 项目旨在为 Ruby 构建一个语言和算法均不可知的 NLP 框架,支持文档检索、文本分块、分段和标记化等任务,自然语言解析,词性标注,关键字提取和命名实体识别。 Classifier —— 通用分类器模块 Classifier 是可用贝叶斯算法及其他分类法的通用分类器模块。贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类,具有准确、快速、内存要求适当等特点。 3、Objective C MLPNeuralNet —— 多层感知器 MLPNeuralNet 是适用于 iOS 和 Mac OS X 的快速多层感知器神经网络库。它使用矢量操作和硬件加速(如果可用)构建在苹果加速框架之上,通过训练有素的神经网络预测新的示例。 4、Swift Bender —— 机器学习框架 Bender 是 MetalPerformanceShaders 之上的一个抽象层(abstraction layer),可用于操作神经网络,旨在更轻松地在 iOS 上运行预训练的网络。它可以让你轻松使用卷积、池化、全连接和一些规范化等最常见的层,从而轻松地定义和运行神经网络。 目前 Bender 有一个用于 TensorFlow 的适配器(adapter),其可以加载带有变量的图(graph),并将其「翻译」成 Bender 的层(layer)。 Swift AI —— 深度学习库 Swift AI 是一个完全由 Swift 编写的高性能 AI 和机器学习库,包含用于人工智能和科学应用的常用工具集,支持卷积神经网络、循环神经网络、遗传算法库、快速线性代数库、信号处理库等。这些工具采用先进的并行处理技术,专门针对 iOS 和 OS X 硬件进行了优化,目前支持所有的 Apple 平台,并计划推出 Linux 版本支持。 5、Scala Breeze —— 数值处理库 Breeze 是一个数值处理库,是 […]
View Details不管是因为什么原因,结果是在新出的MVC中,增加了WebAPI,用于提供REST风格的WebService,个人比较喜欢REST风格的WebService,感觉比SOAP要轻量级一些,而且对客户端的要求也更少,更符合网络数据传输的一般模式,客户端完全摆脱了代理和管道来直接和WebService进行交互,具体的区别可以参见Web 服务编程,REST 与 SOAP
View Detailsjava.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。 Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。
View DetailsJava消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅) 1、定义 JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。 1.1、点对点:Queue,不可重复消费 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。 消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。 1.2、发布/订阅:Topic,可以重复消费 消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。 支持订阅组的发布订阅模式: 发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue,每个Queue是点对点的方式,Queue之间是发布订阅方式。 2、区别 2.1、点对点模式 生产者发送一条消息到queue,一个queue可以有很多消费者,但是一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,所以Queue实现了一个可靠的负载均衡。 2.2、发布订阅模式 发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。 3、流行模型比较 传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循JMS规范。 3.1、RabbitMQ RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。 RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。 (1)点对点 生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。 (2)多订阅 当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费不同的Queue。所以支持多订阅时,消息会多个拷贝。 3.2、Kafka Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。但是可能产生重复消费的情况。 (1)点对点&多订阅 发布者生产一条消息到topic中,不同订阅组消费此消息。 from:http://blog.csdn.net/heyutao007/article/details/50131089
View Details1、删除模型 1.1 使用delete删除模型 删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可:
|
1 2 3 4 5 6 |
$post = Post::find(5); if($post->delete()){ echo '删除文章成功!'; }else{ echo '删除文章失败!'; } |
该方法返回true或false。 1.2 使用destroy删除模型 当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:
|
1 |
$deleted = Post::destroy(5); |
你也可以一次传入多个模型id删除多个模型:
|
1 |
$deleted = Post::destroy([1,2,3,4,5]); |
调用destroy方法返回被删除的记录数。 1.3 使用查询构建器删除模型 既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:
|
1 |
$deleted = Models\Post::where('views', 0)->delete(); |
返回结果为被删除的文章数。 2、软删除及其相关实现 2.1 软删除实现 上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。 所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。 要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; //设置表名 public $table = 'posts'; //设置主键 public $primaryKey = 'id'; //设置日期时间格式 public $dateFormat = 'U'; protected $guarded = ['id','views','user_id','updated_at','created_at']; protected $dates = ['delete_at']; } |
然后对应的数据库posts中添加deleted_at列,我们使用迁移来实现,先执行Artisan命令:
|
1 |
php artisan make:migration alter_posts_deleted_at --table=posts |
然后编辑生成的PHP文件如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AlterPostsDeletedAt extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('posts', function (Blueprint $table) { $table->softDeletes(); }); } ...//其它方法 } |
然后运行:
|
1 |
php artisan migrate |
这样posts中就有了deleted_at列。接下来,我们在控制器中编写测试代码:
|
1 2 3 4 5 6 7 8 |
$post = Post::find(6); $post->delete(); if($post->trashed()){ echo '软删除成功!'; dd($post); }else{ echo '软删除失败!'; } |
在浏览器中访问http://laravel.app:8000/test,页面输出如下: 当我们再次通过下面这段代码获取所有文章:
|
1 2 |
$posts = Post::all(); dd($posts); |
已经看不到id为6的文章的身影了。 2.2 查询结果包含软删除模型 那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:
|
1 2 |
$posts = Post::withTrashed()->get(); dd($posts); |
执行之后页面显示如下: id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:
|
1 2 |
$posts = Post::onlyTrashed()->get(); dd($posts); |
执行后页面显示结果如下: 2.3 软删除恢复 有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法: 恢复单个模型
|
1 2 |
$post = Post::find(6); $post->restore(); |
恢复多个模型
|
1 |
Post::withTrashed()->where('id','>',1)->restore(); |
恢复所有模型
|
1 |
Post::withTrashed()->restore(); |
恢复关联查询模型
|
1 2 |
$post = Post::find(6); $post->history()->restore(); |
2.4 强制删除 如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDelete方法:
|
1 2 |
$post = Post::find(6); $post->forceDelete(); |
查看数据表可以发现id=6的表记录已经被删除,不复存在: 该方法也支持关联模型强制删除,我们后面讲到关联关系的时候再具体说明。 from:http://laravelacademy.org/post/1020.html
View Details1、创建模型 1.1 使用save方法创建模型 调用Eloquent模型类的save方法即可创建模型并插入数据到数据库:
|
1 2 3 4 5 6 7 8 9 10 |
$post = new Post; $post->title = 'test 4'; $post->content = 'test content'; $post->user_id = 1; $post->cat_id = 1; if($post->save()){ echo '添加文章成功!'; }else{ echo '添加文章失败!'; } |
在浏览器中访问http://laravel.app:8000/test,如果输出内容为:
|
1 |
添加文章成功! |
则表明插入成功,我们去数据库查看数据,确实新增了一条记录: 1.2 使用create方法插入数据 除此之外还可以使用create方法插入数据,由于该方法中用到了批量赋值(Mass Assignment),所以我们需要在模型类中设置$fillable属性或者$guarded属性,以表明哪些属性可以通过该方法设置,哪些不可以。 开始之前,我们先解释下什么是批量赋值,以及为什么要使用批量赋值。 批量赋值的英文名称是Mass Assignment,所谓的批量赋值是指当我们将一个数组发送到模型类用于创建新的模型实例的时候(通常是表单请求数据),我们可以简单通过如下方式实现:
|
1 |
$post = Post::create(Input::all()); |
而不是像使用save方法那样一个一个的设置属性值,如果模型属性很多的话,使用save简直是噩梦有木有。 但事物总是相对的,使用批量赋值是很方便,但同时也带来了安全隐患,很多时候模型类的某些属性值不是我们所期望通过批量赋值修改的,比如用户模型有个user_type属性,如果用户通过请求数据将其类型修改为管理员类型,这显然是不允许的,正是基于这一考虑,Eloquent模型类为我们提供了$fillable属性和$guarded属性,我们可以将其分别看作“白名单”和“黑名单”,定义在$fillable中的属性可以通过批量赋值进行赋值,而定义在$guarded中的属性在批量赋值时会被过滤掉。 那么如果我们确实想要修改定义在$guarded中的属性怎么办?答案是使用save方法。 此外需要注意的是$fillable和$guarded方法同时只能定义一个,原因嘛很简单,非黑即白,定义了一个另外一个也就确定了。 可见批量赋值不仅为我们创建模型提供了便利,还避免了安全隐患,提高了系统的安全性。 下面我们来演示一下批量赋值的使用。首先在Post模型中定义$guarded属性如下:
|
1 |
protected $guarded = ['views','user_id','updated_at','created_at']; |
然后在控制器中实现创建模型实例的逻辑:
|
1 2 3 4 5 6 7 8 9 |
$input = [ 'title'=>'test 5', 'content'=>'test content', 'cat_id'=>1, 'views'=>100, 'user_id'=>2 ]; $post = Post::create($input); dd($post); |
在浏览器中输入http://laravel.app:8000/test,则页面输出: 可见user_id和views字段都没有插入进去,这正是$guarded发挥了作用,如果要设置这两个值也很简单:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$input = [ 'title'=>'test 5', 'content'=>'test content', 'cat_id'=>1, 'views'=>100, 'user_id'=>2 ]; $post = Post::create($input); $post->user_id = 2; $post->views = 100; $post->save(); dd($post); |
对应输出如下: 1.3 其他插入数据的方法 Eloquent模型类还支持其它插入数据的方法——firstOrCreate和firstOrNew,两者都是先通过通过传入属性值在数据库中查找匹配记录,如果没有找到则创建一个新的模型实例,不同之处在于后者不会将数据持久化到数据库,需要调用save方法才行。 2、更新模型 2.1 使用save方法更新模型 save方法还可以用于更新模型,要更新模型数据,先要获取该模型实例,然后修改模型属性,再调用save方法保存即可:
|
1 2 3 4 5 6 7 |
$post = Post::find(1); $post->title = 'test 1 title'; if($post->save()){ echo '更新文章成功!'; }else{ echo '更新文章失败!'; } |
在浏览器中访问http://laravel.app:8000/test,如果显示:
|
1 |
更新文章成功! |
则表明数据库对应表记录更新成功: 2.2 使用update方法更新数据 和create相对应的,Eloquent模型类还支持使用update方法更新数据,同样要用到批量赋值:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$input = [ 'title'=>'test 6 title', 'content'=>'test content 6', 'cat_id'=>1, 'views'=>200, 'user_id'=>1 ]; $post = Post::find(6); if($post->update($input)){ echo '更新文章成功!'; dd($post); }else{ echo '更新文章失败!'; } |
对应输出为: 可见user_id和views并没有更新。 from:http://laravelacademy.org/post/984.html
View Details1、引子 在正式进入本节的之前,让我们先来看看什么是ORM。 ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。 ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,ActiveRecord 尤其流行,在很多框架中都能看到它的身影。两者的区别主要在于 ActiveRecord 中模型与数据表一一对应,而 DataMapper 中模型与数据表是完全分离的。 Laravel 中的 Eloquent ORM 使用的也是 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。 2、定义模型 2.1 创建模型 我们使用Artisan命令make:model生成模型类,模型类默认位于app目录下,我们也可以在创建时指定生成目录:
|
1 |
php artisan make:model Models/Post |
这样就会在app目录下生成一个Models目录,并且在Models目录下生成一个Post模型类。Laravel 中所有模型类继承自Illuminate\Database\Eloquent\Model类。 2.2 指定表名 如果不手动指定,默认Post对应的数据表为posts,以此类推。也可以通过设置$table属性自定义表名:
|
1 |
public $table = 'posts'; |
2.3 指定主键 Eloquent默认数据表主键为id,当然也可以通过设置$primaryKey属性来自定义主键:
|
1 |
public $primaryKey = 'id'; |
2.4 时间戳设置 默认情况下,Eloquent模型类会自动管理时间戳列create_at和update_at(如果定义迁移时设置了这两列的话),如果要取消自动管理,可以设置$timestamps属性为false:
|
1 |
public $timestamps = false; |
还有,如果你想要设置时间戳的格式,可以使用$dateFormat属性,该属性决定了日期时间以何种格式存入数据库,以及以何种格式显示:
|
1 2 |
//设置日期时间格式为Unix时间戳 protected $dateFormat = 'U'; |
更多关于日期时间格式设置,请参考php官方函数date中format部分。 3、查询数据 3.1 获取多个模型 我们可以使用Eloquent模型上的all方法获取所有模型实例,比如我们通过如下方法获取所有文章:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use App\Models\Post; class TestController extends Controller { /** * Display a listing of the resource. * * @return Response */ public function index() { //获取多个Eloquent模型 $posts = Post::all(); dd($posts); } } |
对应输出结果为: 可见输出结果是模型数组集合,每一个$items元素对应一个Post模型实例。 此外,需要了解的是每一个Eloquent模型本身都是一个查询构建器,所有我们可以调用所有查询构建器上的方法,只不过第一个方法调用都要使用静态方法调用:
|
1 2 |
$posts = Post::where('id','<',3)->orderBy('id','desc')->take(1)->get(); dd($posts); |
对应输出结果为: 也许你已经注意到了,模型查询返回结果都是Illuminate\Database\Eloquent\Collection的一个实例,该类实现了ArrayAccess接口,所以我们可以像访问数组一样访问该实例,此外,该Collection类还提供了很多其它有用的方法对查询结果进行处理,详见源码。 既然Eloquent模型是查询构建器,自然也支持分组块获取数据:
|
1 2 3 4 5 |
Post::chunk(2,function($posts){ foreach ($posts as $post) { echo $post->title.'<br>'; } }); |
输出结果如下:
|
1 2 3 |
test 1 test 2 test 3 |
3.2 获取单个模型 可以使用查询构建器方法获取单个模型实例:
|
1 2 |
$post = Post::where('id',1)->first(); dd($post); |
当然也可以通过Eloquent模型类提供的快捷方法find:
|
1 |
$post = Post::find(1); |
两者输出结果一样: 如果没有找到对应的表记录,会输出null,如果我们想要捕获查询结果为空的异常并进行处理,比如跳转到404页面,可以使用findOrFail或者firstOrFail方法,如果表记录存在,两者返回获取到的第一条记录,否则抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。 3.3 聚合函数查询 如果要对查询结果进行计数、统计、最大值/最小值、平均数等聚合运算,可以使用查询构建器上的对应方法,我们我们查询文章总数:
|
1 2 |
$count = Post::where('id','>',0)->count(); echo $count; |
输出结果为3,又或者我们想要获取文章最大阅读数:
|
1 2 |
$views = Post::where('id','>',0)->max('views'); echo $views; |
输出结果为800。 from:http://laravelacademy.org/post/966.html
View Details