Laravel集成了EloquentORM框架,虽然使用它并不是必须的,但实际上几乎在每个CRUD项目中ORM都会用到。这篇笔记我们来学习一下这个ORM框架。
使用ORM前,需要在config/database.php
中正确的配置数据库,这在之前的章节已经介绍过,参考PHP网络应用开发/Laravel/10-数据库
。另外,我们还需要先设计并创建好数据表。Laravel的模型并不需要手动编写字段,它能够从数据表中自动读取字段,但前提是数据表已经创建好。
使用如下命令能够创建一个数据模型。
php artisan make:model Student
创建的数据模型文件,默认在项目根目录app
文件夹下,模型名中也可以指定更深层次的命名空间,默认生成的模型代码例子如下。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
//
}
我们可以发现,数据模型都是继承Model
类的。
protected $table = 't_student';
$table
可以指定数据表名,其默认值为类名的蛇形命名,比如ProductType
,对应的表名为product_type
。
protected $primaryKey = 'student_id';
$primaryKey
可以指定表的主键,默认名为id
。
巨坑注意:primaryKey
的K
为大写,写错会出现诡异问题,而且极难发现!!
public $incrementing = true;
$incrementing
可以指定整数主键自增,默认值为true
。如果你的主键是非自增的,或非数字主键,需要指定其为false
。
protected $keyType = 'string';
$keyType
指定主键的数据类型,如果你的主键非整形,则需要指定该属性。
注:EloquentORM不支持联合主键。
public $timestamps = false;
$timestamps
用来配置数据表记录的时间戳功能。该功能需要在表中存在create_at
和update_at
两个字段,用来存储数据记录创建和最后更新的时间戳,并由ORM框架自动维护。如果不使用该功能,需要指定$timestamps
为false
。
protected $dateFormat = 'Y-m-d H:i:s';
$dateFormat
用于配置时间戳的格式,默认为Unix时间戳。
const CREATED_AT = 'create_time';
const UPDATED_AT = 'last_modified_time';
如果需要改变两个时间戳字段的默认名字,可以指定CREATED_AT
和UPDATED_AT
这两个常量。
protected $attributes = [
'cust_info_create_time' => '1999-12-31 00:00:00',
];
$attributes
可以指定数据模型关联表字段的默认值。关联数组的键是字段名,值是要插入的字段值。
下面例子代码中,实例化了一个数据模型Student
并保存。
数据表例子如下。
CREATE TABLE `t_student` (
`student_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名字',
`age` int(11) NOT NULL COMMENT '年龄',
`grade` int(11) NOT NULL COMMENT '年级',
PRIMARY KEY (`student_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
数据模型Student.php代码如下。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
protected $table = 't_student';
protected $primaryKey = 'student_id';
public $incrementing = true;
public $timestamps = false;
}
ORM操作语句例子如下。
$student = new Student();
$student->name = 'Lucy';
$student->age = 18;
$student->grade = 4;
$student->save();
实际上,我们的数据模型定义中,没有name
、age
等字段,这些都是EloquentORM根据数据表自动创建的。