快速入门
简介
Laravel 包含了 Eloquent,这是一个对象关系映射器(ORM),使与数据库的交互变得很愉快。使用 Eloquent 时,每个数据库表都有一个对应的 “模型”,用于与该表进行交互。除了从数据库表中检索记录外,Eloquent 模型还允许您从表中插入,更新和删除记录。
技巧:在开始之前,请确保在应用程序的 config/database.php 配置文件中配置数据库连接。有关配置数据库的更多信息,请参阅数据库配置文档。
生成模型类
首先,让我们创建一个 Eloquent 模型。模型通常位于 app\Models 目录中,并扩展 Illuminate\Database\Eloquent\Model 类。您可以使用 make:modelArtisan command 生成新模型:
php artisan make:model Flight
如果想要在生成模型的同时生成 数据库迁移,可以使用 --migration
或 -m
选项。
php artisan make:model Flight --migration
在生成模型的同时,你可能还想要各种其他类型的类,例如模型工厂、数据填充和控制器。这些选项可以组合在一起从而一次创建多个类:
# 生成模型和 Flight工厂类...
php artisan make:model Flight --factory
php artisan make:model Flight -f
# 生成模型和 Flight 数据填充类...
php artisan make:model Flight --seed
php artisan make:model Flight -s
# 生成模型和 Flight 控制器类...
php artisan make:model Flight --controller
php artisan make:model Flight -c
# 生成模型和迁移(m)、工厂(f)、数据填充(s)、控制器(c)...
php artisan make:model Flight -mfsc
Eloquent 模型约定
由命令 make:model
生成的模型会被安放在 app/Models
目录下。现在,我们来看一个基本的模型示例,随后开始讨论 Eloquent 的一些关键约定。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
}
数据表名称
看过上面的示例,你可能留意到了我们没有为 Eloquent 指明 Flight 模型要使用哪张数据表。除非明确指定使用其它数据表,否则将按照约定,使用类的复数形式「蛇形命名」来作为表名。因此,在这种情况下,Eloquent 将认为 Flight 模型存储的是 flights 表中的数据,而 AirTrafficController 模型会将记录存储在 air_traffic_controllers 表中。
如果模型的相应数据库表不符合此约定,可以通过在模型上定义 table 属性并指定模型的表名:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 该表将与模型关联。
*
* @var string
*/
protected $table = 'my_flights';
}
主键
Eloquent 将假设模型有一个默认的主键列,该列为 id
。如果有必要,你可以定义一个 protected 属性的字段 $primaryKey
,用来指定为模型的主键。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 与表关联的主键。
*
* @var string
*/
protected $primaryKey = 'flight_id';
}
另外,Eloquent 默认有一个 integer 值的主键,Eloquent 会自动转换这个主键为一个 integer 类型,如果你的主键不是自增或者不是数字类型,你可以在你的模型上定义一个 public 属性的 $incrementing ,并将其设置为 false。
<?php
class Flight extends Model
{
/**
* 指明模型的 ID 不是自增。
*
* @var bool
*/
public $incrementing = false;
}
//如果你模型主键不是integer,你应该定义一个 protected `$keyType` 在你的模型师。这个属性应该有一个值 `string`:
<?php
class Flight extends Model
{
/**
* 自增ID的数据类型。
*
* @var string
*/
protected $keyType = 'string';
}
复合主键
Eloquent 要求每一个模型上至少有一个唯一标识 ID
,用他当做主键存储。模型是不支持 “复合主键” 的。无论如何,你可以添加一个多列唯一索引到你的数据表中来当做你的的唯一标识主键。
时间戳(Timestamps)
默认情况下,Eloquent 希望模型相应的数据库表中存在 created_at 和 updated_at 列。在创建或更新模型时,Eloquent 将自动设置这些列的值。如果不希望这些列由 Eloquent 自动管理,那么你应该在模型上定义一个 $timestamps 属性并且值为 false:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 是否主动维护时间戳
*
* @var bool
*/
public $timestamps = false;
}
如果需要自定义时间戳的格式,在你的模型中设置 $dateFormat
属性。这个属性决定日期属性在数据库的存储方式,以及模型序列化为数组或者 JSON 的格式:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 模型日期的存储格式
*
* @var string
*/
protected $dateFormat = 'U';
}
如果你需要自定义存储时间戳的字段名,可以在模型中设置 CREATED_AT
和 UPDATED_AT
常量的值来实现:
<?php
class Flight extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'updated_date';
}
数据库连接 (Database Connections)
默认情况下,Eloquent 模型将使用你的应用程序配置的默认数据库连接。如果你将要指定使用特殊的数据库链接在你的模型,你可以设置一个 $connection
属性在你的模型:.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 设置当前模型使用的数据库连接名
*
* @var string
*/
protected $connection = 'sqlite';
}
默认属性值
默认情况下,新实例化的模型实例将不包含任何属性值。 如果你想为模型的某些属性定义默认值,则可以在模型上定义一个 $attributes
属性:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'delayed' => false,
];
}
模型检索
创建模型和 它关联的数据库表 后,你就可以从数据库中查询数据了。你可以将每个 Eloquent 模型视为一个强大的 查询构造器,使你能够更快速地查询与该模型关联的数据库表。模型的 all 方法将从模型的关联数据库表中检索所有记录:
use App\Models\Flight;
foreach (Flight::all() as $flight) {
echo $flight->name;
}
附加约束
Eloquent 的 all
方法会返回模型中所有的结果。由于每个 Eloquent 模型都充当一个 查询构造器 ,所以你也可以添加查询条件,然后使用 get
方法获取查询结果:
$flights = Flight::where('active', 1)
->orderBy('name')
->take(10)
->get();
技巧:因为 Eloquent 模型也是查询构造器,所以你也应当阅读 查询构造器 可用的所有方法。你可以在 Eloquent 查询中使用这些方法。
重新加载模型
你可以使用 fresh
和 refresh
重新加载从数据库中检索的 Eloquent 模型实例。fresh
方法会重新从数据库中检索模型。现有的模型实例不受影响:
$flight = Flight::where('number', 'FR 900')->first();
$freshFlight = $flight->fresh();
refresh
方法会使用数据库中的新数据重新赋值现有的模型。此外,已经加载的关系也会被重新加载:
$flight = Flight::where('number', 'FR 900')->first();
$flight->number = 'FR 456';
$flight->refresh();
$flight->number; // "FR 900"
集合
Eloquent 的 all 和 get 会从数据库中取得多个结果。然而,这些方法返回的不是 PHP 数组,而是一个 Illuminate\Database\Eloquent\Collection 实例。
Eloquent 的 Collection 继承自 Laravel 的基类 Illuminate\Support\Collection,它提供了大量的辅助函数 来与数据集交互。例如,reject 方法可以根据闭包中的结果从集合中删除模型:
$flights = Flight::where('destination', 'Paris')->get();
$flights = $flights->reject(function ($flight) {
return $flight->cancelled;
});
除了 Laravel 集合基类提供的函数外,Eloquent 集合还提供了一些额外的函数,这些函数专用于与 Eloquent 模型集合进行交互。
由于 Laravel 的集合实现了 PHP 的可迭代接口,因此你可以像循环数组一样循环集合:
foreach ($flights as $flight) {
echo $flight->name;
}