Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord
实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互
创建模型
php artisan make:model Flight
生成的模型会保存在通常在app\Models目录中
还可以在生成模型的时候生成数据库迁移
常用的一种方式,创建模型的同时再去生成迁移文件
使用 --migration 或 -m
php artisan make:model Flight --migration
php artisan make:model Flight -m
Eloquent 模型约定
默认数据库
默认情况下,模型与数据库名是对应的。它使用类的复数形式「蛇形命名」来作为表名,如Flight模型对应的数据库是flights
通过在模型上定义 table 属性来指定自定义数据表
class Flight extends Model
{
/**
* 与模型关联的表名
*
* @var string
*/
protected $table = 'my_flights';
}
每个模型默认的键都是id,并且是自增的整型
定义一个受保护的 $primaryKey 属性来重写约定
class Flight extends Model
{
/**
* 与表关联的主键
*
* @var string
*/
protected $primaryKey = 'flight_id';
}
默认时间戳
默认情况下,Eloquent 预期你的数据表中存在 created_at 和 updated_at 两个字段
如果不想让 Eloquent 自动管理这两个列, 那么就将模型中的 $timestamps 属性设置为 false
class Flight extends Model
{
/**
* 是否主动维护时间戳
*
* @var bool
*/
public $timestamps = false;
}
如果需要自定义时间戳的格式,在你的模型中设置 $dateFormat 属性。这个属性决定日期属性在数据库的存储方式
class Flight extends Model
{
/**
* 模型日期的存储格式
*
* @var string
*/
protected $dateFormat = 'U';
}
模型检索
创建模型和 它关联的数据库表后,你就可以从数据库中查询数据了
例如,查询所有数据
$data = Flight::all();
dd($data);
由于每个模型都充当一个 查询构造器,所以也可以添加查询条件,然后使用 get 方法获取查询结果
$flights = App\Models\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
在模型中插入数据
要往数据库新增一条记录,先创建新模型实例,
给实例设置属性,然后调用 save 方法
$flight = new Flight();
$flight->name = '大信';
$res = $flight->save();
在模型中,默认是自动写入时间戳的。created_at 和 updated_at 时间戳将会自动设置,不需要手动赋值
使用模型更新数据
更新模型,你需要先检索出来,设置要更新的属性,然后调用 save 方法。同样,updated_at 时间戳会自动更新,所以也不需要手动赋值
$data = Flight::find(1);
$data->name = '大大信';
$res = $data->save();
批量更新
Flight::where('name', '=', '大信')->update([
'name' => '啊信'
]);
批量添加数据或赋值
使用 create 方法来保存新模型
不过,在使用之前,需要在模型上指定 fillable 或 guarded 属性,因为所有的 Eloquent 模型都默认不可进行批量赋值。
class Flight extends Model
{
/**
* 可批量赋值属性
*
* @var array
*/
protected $fillable = ['name'];
}
一旦我们设置好了可以批量赋值的属性,就可以通过 create 方法插入新数据到数据库中了
create 方法将返回保存的模型实例
Flight::create([
'name'=>'小信',
]);
如果你想让所有属性都可以批量赋值, 你可以将 $guarded 定义成一个空数组
/**
* 不可批量赋值的属性
*
* @var array
*/
protected $guarded = [];
使用insert批量添加数据
Flight::insert([
['name' => '猪八戒'],
['name' => '孙悟空']
]);
值得一提的是,insert并不会通过模型去添加数据。而create是通过模型处理的
如果是已经有一个模型实例的情况,可以传递一个数组给 fill 方法来赋值
这是一种比较常见的方式,不用一个一个设置属性赋值
$flight->fill(['name' => 'Flight 22']);
删除模型
可以在模型实例上调用 delete 方法来删除实例
$data = Flight::find(1);
$res = $data->delete();
通过主键删除模型
如果知道了模型的主键,可以直接使用 destroy 方法来删除模型,而不用先去数据库中查找
App\Models\Flight::destroy(1);
destroy 方法除了接受单个主键作为参数之外,还接受多个主键,或者使用数组、集合来保存多个主键