简介
Laravel 内置的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的 ActiveRecord 实现。
每张数据表都对应一个与该表进行交互的模型(Model),通过模型类,你可以对数据表进行查询、插入、更新、删除等操作。
定义模型
我们从创建一个 Eloquent 模型开始,模型类默认位于 app 目录下,但推荐将模型存放在 app/Models 目录下。
所有 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。
创建模型最简单的方法就是使用 Artisan 命令 make:model。
php artisan make:model Test
上述命令会自动生成 app/Test.php 模型文件。
为了将模型存放到 app/Models 目录,在使用 Artisan 命令 make:model 时,可以在模型名称的前面加上一个相对目录名 Models/。
php artisan make:model Models/Test
这样,就会自动生成 app/Models/Test.php 模型文件。内容如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Test extends Model
{
//
}
如果你想要在生成模型时生成数据库迁移,可以使用 --migration 或 -m 选项:
php artisan make:model User --migration
php artisan make:model User -m
Eloquent 模型约定
现在,让我们来看一个 Flight 模型的例子,我们将用该类获取和存取数据表 flights 中的信息:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
}
表名
在本例中,我们并没有明确指定 Flight 模型使用哪张表。
默认规则是小写的模型类名的复数格式作为与其对应的表名(除非在模型类中明确指定了数据表的名称)。
所以,在本例中,Eloquent 认为 Flight 模型对应的是 flights 表。
你也可以在模型中定义 table 属性来指定自定义的表名。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 与模型对应的数据表
*
* @var string
*/
protected $table = 'my_flights';
}
主键
Eloquent 默认每张表的主键名为 id,你可以在模型类中定义一个 $primaryKey 属性来覆盖该约定。
此外,Eloquent 默认主键字段是自增的整型数据,这意味着主键将会被自动转化为 int 类型,如果你想要使用非自增或非数字类型主键,必须在对应模型中设置 $incrementing 属性为 false,如果主键不是整型,还要设置 $keyType 属性值为 string。
时间戳
默认情况下,Eloquent 期望 created_at 和 updated_at 已经存在于数据表中。
如果你不让 Laravel 自动管理这些字段,就在模型类中设置 $timestamps 属性为 false。
public $timestamps = false;
如果你需要自定义时间戳格式,就设置模型中的 $dateFormat 属性。该属性决定日期被如何存储到数据库中,以及模型被序列化为数组或 JSON 时日期的格式。
protected $dateFormat = 'U';
如果你需要自定义用于存储时间戳的字段名称,可以在模型中设置 CREATED_AT 和 UPDATED_AT 常量:
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
数据库连接
默认情况下,所有的 Eloquent 模型使用应用配置中的默认数据库连接,如果你想要为模型指定不同的连接,可以通过 $connection 属性来设置。
protected $connection = 'connection-name';
获取模型
创建完模型及其关联的数据表后,就可以从数据库中获取数据了。
将 Eloquent 模型看作功能强大的查询构建器,你可以使用它来流畅的查询与其关联的数据表。
<?php
use App\Flight;
$flights = App\Flight::all();
foreach ($flights as $flight) {
echo $flight->name;
}
Eloquent 的 all 方法返回模型表的所有结果,由于每一个 Eloquent 模型都是一个查询构建器,你还可以添加约束条件到查询,然后使用 get 方法获取对应结果。
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
注:由于 Eloquent 模型本质上就是查询构建器,你可以在 Eloquent 查询中使用查询构建器的所有方法。
集合
对于 Eloquent 中获取多个结果的方法(比如 all 和 get)而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例,Collection 类提供了多个有用的函数来处理 Eloquent 结果集。
$flights = $flights->reject(function ($flight) {
return $flight->cancelled;
});
当然,你也可以像数组一样循环遍历该集合:
foreach ($flights as $flight) {
echo $flight->name;
}
组块结果集
如果你需要处理数据量很大的 Eloquent 结果集,可以使用 chunk 方法。chunk