1、引子 在正式进入本节的之前,让我们先来看看什么是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