https://laravelacademy.org/post/9699.htmlphp
建议用DB门面直接操做数据库,由于ORM性能低。数据查询上面,ORM不会比DB差的,就好比with,是用了sql最基本的拆语句优化。ORM的损耗仅仅是代码层面的,这已经不算是问题了。html
ORM适用于通常到中等复杂度的查询,也适用于各类模型操做,好比有一个关系targets,你能够直接用targets()->delete()等等进行关系数据操做。
ORM中的软删除,自动更新时间字段,字段保护,字段类型转换,都会在一些规范并且系统的工程中让你受益。laravel
另外DB的场景:一些比较复杂的查询语句,事务操做,等都须要DB来完成。sql
模型类定义 使用模型类以前,须要在数据库有对应的数据表,由于模型类就是数据表在面向对象编程语言中的映射。好比咱们前面几篇教程中用到的 User 模型和 Post 模型都是这样,要建立一个模型类,须要使用 make:model 命令: php artisan make:model Post 注:若是对应的数据表还没有建立,你还能够在建立模型类的同时建立对应的数据库迁移文件,经过 php artisan make:model Post -m 便可。若是你想将模型类建立到 app/Models 目录下,能够这么运行上述命令 php artisan make:model Models/Post。 接下来咱们就是 posts 表映射的 Post 模型为例,来看看默认都有哪些约定。新生成的 Post 模型类以下: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // } 里面什么东西都没有,可是咱们就能够经过它完成数据表记录的增删改查操做了,怎么作到的?这就是「约定优于配置」的功劳了。下面咱们就来看看这些默认的约定。 表名 Eloquent 约定模型类映射表名是将类名由驼峰格式转化为小写+下划线(含多个单词的话),最后将其转化为复数形式,好比 Post 对应表名是 posts、PostTag 对应表名是 post_tags 等等。固然,若是你不想遵循这个系统约定的规则,也能够经过手动设置模型类属性的方式进行自定义,例如: protected $table = 'articles'; 主键 Eloquent 默认假设每张数据表都有一个整型的自增主键,其字段名为 id,若是你的数据表主键名不是 id,能够经过 $primaryKey 属性来指定: protected $primaryKey = 'post_id'; 若是主键不是自增的,还能够设置 $incrementing 属性为 false: public $incrementing = false; 若是主键不是整型,还能够设置 $keyType 属性为 string: protected $keyType = 'string'; 时间戳 Eloquent 默认约定每张表都有 created_at 和 updated_at 字段(迁移类中 $table->timestamps() 会生成这两个字段),而且在保存模型类时会自动维护这两个字段。若是你的数据表里面不包含这两个字段,或者只包含一个,都须要设置 $timestamps 属性为 false: public $timestamps = false; 或者经过 CREATED_AT 和 UPDATED_AT 常量来设置自定义的建立和更新时间字段: public const CREATED_AT = 'create_time'; public const UPDATED_AT = 'update_time'; 此外,默认时间的存储格式是 Y-m-d H:i:s,你还能够经过 $dateFormat 属性来自定义时间戳的格式,该属性值经过 PHP 的 date() 函数进行解析,因此原则上支持 date 函数支持的全部语法格式,好比将时间设置为 Unix 时间戳: protected $dateFormat = 'U'; 这样,保存到数据库的时间格式就是 Unix 时间戳了,前提是你的 created_at 和 updated_at 字段是整型,不然会报格式错误。 数据库链接 Eloquent 模型类默认约定的数据库链接是 config/database.php 中配置的默认链接,正如咱们在链接配置教程中所说的那样,若是应用配置了多个数据库链接,能够经过 $connection 属性为模型类指定使用哪一个链接: protected $connection = 'connection_name'; 查询数据 平常开发中,大部分操做都是数据库中查询数据,Eloquent 模型了为咱们提供了不少方法帮助咱们从数据库中获取数据。 获取全部记录 咱们能够经过模型类提供的 all 方法获取一张表的全部记录: $posts = Post:all(); 和查询构建器同样,该方法返回的也是集合,只不过是模型类集合: 要获取指定模型类的字段属性,遍历该集合便可: foreach ($posts as $post) { dump($post->title); } 和查询构建器同样,若是结果集很大的话,模型类也支持经过 chunk 方法分块获取查询结果: Post::chunk(10, function ($posts) { foreach ($posts as $post) { if ($post->views == 0) { continue; } else { dump($post->title . ':' . $post->views); } } }); 除此以外,在 Eloquent 模型中还能够经过 cursor 方法每次只获取一条查询结果,从而最大限度减小内存消耗: foreach (Post::cursor() as $post) { dump($post->title . ':' . $post->content); } 获取指定查询结果 若是想要指定查询条件和查询字段,能够经过 where 方法和 select 方法来实现: $posts = Post::where('views', '>', 0)->select('id', 'title', 'content')->get(); 对应查询结果以下: 实际上,Eloquent 模型类底层的查询也是基于查询构建器来实现的,你能够在模型类上调用全部查询构建器的 Where 查询方法,一样是以流接口的模式构建方法链调用便可。前面提到的 chunk 和 cursor 方法也适用于这种指定查询条件的查询操做。 由于是查询构建器,因此咱们还能够在模型查询操做中对查询结果进行排序和分页: $posts = Post::where('views', '>', 0)->orderBy('id', 'desc')->offset(10)->limit(5)->get(); 对应的返回结果以下: 获取单条记录 固然,你也能够经过查询构建器的方式在模型类查询中获取单条记录: $user = User::where('name', '学院君')->first(); 返回的结果是一个模型类实例: 你能够直接经过 $user->name 这样的方式访问模型类实例的属性。 此外,若是查询的条件是主键 ID 的话,还能够将上述调用简化为经过 find 方法来实现: $user = User::find(1); 返回结果与上面彻底一致。 模型类查询结果为空会返回 null。若是你想要在单条记录返回结果为空时返回 404 响应(在控制器方法中可能须要用到相似操做),能够经过 firstOrFail 或者 findOrFail 方法在找不到对应记录时抛出 404 异常,从而简化代码编写: $user = User::findOrFail(111); 若是 id=111 的记录在 users 数据表中不存在,就会返回 404 响应: 获取聚合结果 Eloquent 模型类一样支持 count、sum、avg、max、min 等聚合函数查询: $num = User::whereNotNull('email_verified_at')->count(); # 计数 $sum = User::whereNotNull('email_verified_at')->sum('id'); # 求和 $avg = User::whereNotNull('email_verified_at')->avg('id'); # 平均值 $min = User::whereNotNull('email_verified_at')->min('id'); # 最小值 $max = User::whereNotNull('email_verified_at')->max('id'); # 最大值 你会发现,若是你掌握了查询构建器,就等同于掌握了 Laravel 中的全部数据库查询操做。只不过将 DB::table 换成对应的模型类而已。 注:除获取单条记录以外,ELoquent 模型类查询返回的结果都是集合类,所以你能够在查询结果上调用集合类的全部方法,还能够自定义模型对应集合类,详情请查看对应官方文档。 插入数据 经过 Eloquent 模型类插入记录到数据库也比较简单: $post = new App\Post; $post->title = '测试文章标题'; $post->content = '测试文章内容'; $post->user_id = 1; $post->save(); 建立时间和更新时间字段由 Eloquent 底层自动帮咱们维护(遵循默认约定的话)。执行上面的代码就会在数据库新增一条记录(咱们在 Tinker 中执行上述代码): 咱们先要建立一个新的 Post 模型实例,而后依次设置须要设置的字段,最后调用 save 方法保存便可。 此外,Eloquent 还为咱们提供了一些快捷的插入方法,好比 firstOrCreate 和 firstOrNew,这两个方法都会先尝试经过指定查询条件在数据库中查找对应记录,若是没有找到的话,会建立对应模型类的实例,并将查询条件做为对应字段值设置到模型属性上。二者的区别是 firstOrCreate 方法在设置完模型属性后会将该模型记录保存到数据库中,而 firstOrNew 不会: $post_1 = Post::firstOrCreate([ 'title' => '测试文章标题1', 'user_id' => 1, ]); $post_2 = Post::firstOrNew([ 'title' => '测试文章标题1', 'user_id' => 1, ]); 不过学院君倒不建议这么作,感受仍是分开写代码可读性更好一些,也方便本身去处理一些异常状况。 更新数据 经过模型类更新数据表记录也很简单: $post = Post::find(31); $post->title = '测试文章标题更新'; $post->save(); 更新时间 Eloquent 底层会自动帮咱们维护,执行上面的代码便可完成该 $post 模型对应数据表记录的更新: 一样,Eloquent 也为咱们提供了快捷的更新方法 updateOrCreate,该方法首先会根据传入参数对模型对应记录进行更新,若是发现对应记录不存在,则会将更新数据做为初始数据插入数据库,并保存(一样也不建议这么作,除非你的场景特别适合): $user = user::updateOrCreate( ['name' => '学院君'], ['email' => 'admin@laravelacademy.org'] ); 有的时候咱们可能须要批量更新模型对应数据表的多条记录,这能够借助查询构建器来实现: Post::where('views', '>', 0)->update(['views' => 100]); 删除数据 经过模型类删除对应数据表记录和更新记录相似,都要先获取对应操做模型实例,删除对应记录更简单,获取到模型实例后,直接调用其删除方法便可: $post = Post::find(31); $post->delete(); 这样,就完成了 id = 31 对应数据表记录的删除,你还能够经过 Eloquent 提供的 destroy 方法一次删除多条记录,经过数组传递多个主键 ID 便可: Post::destroy([1,2,3]); 固然,你也能够经过查询构建器的方式删除指定记录: $user = User::where('name', '学院君')->fisrt(); $user->delete(); 结语 在这篇教程中,咱们简单给你们介绍了 Eloquent 是什么,以及「约定优于配置」理念在 Eloquent 中的应用,最后还给你们演示了如何经过 Eloquent 实现数据库的增删改查,固然,Eloquent 的功能远不只如此,还支持不少强大的功能,好比批量赋值、软删除、查询做用域设置、模型事件、关联关系等,下一篇教程开始学院君将带领你们来逐一了解这些高阶功能。