Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」(一个表对应一个class)用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。
在开始之前,请确保在 config/database.php
中配置数据库连接。更多关于数据库的配置信息,请查看Laravel官方开发文档。
模型定义
e.g. 创建文章模块模型
1 | php artisan make:model Post |
如果要一块创建迁移文件
1 | php artisan make:model Post -m |
在 ./app
目录下生成 Post.php
1 |
|
Eloquent 模型约定
数据表名称
1 | /** |
主键
Eloquent 也会假设每个数据表都有一个名为 id
的主键列。你可以定义一个受保护的 $primaryKey
属性来重写约定。
此外,Eloquent 假设主键是一个自增的整数值,这意味着默认情况下主键会自动转换为 int
类型。如果您希望使用非递增或非数字的主键则需要设置公共的 $incrementing
属性设置为 false
。如果你的主键不是一个整数,你需要将模型上受保护的 $keyType
属性设置为 string
。
时间戳
默认情况下,Eloquent 预期你的数据表中存在 created_at
和 updated_at
。如果你不想让 Eloquent 自动管理这两个列, 请将模型中的 $timestamps
属性设置为 false:
1 | /** |
如果需要自定义时间戳的格式,在你的模型中设置 $dateFormat
属性。这个属性决定日期属性在数据库的存储方式,以及模型序列化为数组或者 JSON 的格式:
1 | /** |
如果你需要自定义存储时间戳的字段名,可以在模型中设置 CREATED_AT
和 UPDATED_AT
常量的值来实现:
1 | const CREATED_AT = 'creation_date'; |
数据库连接
默认情况下,Eloquent 模型将使用你的应用程序配置的默认数据库连接。如果你想为模型指定一个不同的连接,设置 $connection
属性:
1 | /** |
默认属性值
如果要为模型的某些属性定义默认值,可以在模型上定义 $attributes
属性:
1 | /** |
插入 & 更新模型
批量赋值
你也可以使用 create
方法来保存新模型,此方法会返回模型实例。不过,在使用之前,你需要在模型上指定 fillable
或 guarded
属性,二者选其一,因为所有的 Eloquent 模型都默认不可进行批量赋值。
当用户通过 HTTP 请求传入一个意外的参数,并且该参数更改了数据库中你不需要更改的字段时。比如:恶意用户可能会通过 HTTP 请求传入 is_admin
参数,然后将其传给 create
方法,此操作能让用户将自己升级成管理员。
所以,在开始之前,你应该定义好模型上的哪些属性是可以被批量赋值的。你可以通过模型上的 $fillable
属性来实现。 例如:让 Post 模型的 title
、content
属性可以被批量赋值:
1 | class Post extends Model |
如果没有不需要注入的字段,用 protected $guarded = []
模型关联
- 一对一
hasOne
(用户 - 手机号) - 一对多
hasMany
(文章 - 评论) - 一对多反向
belongsTo
(评论 - 文章) - 多对多
belongsToMany
(用户 - 角色) - 远层一对多
hasManyThrough
(国家 - 作者 - 文章) - 多态关联
morphMany
(文章/视频 - 评论) - 多态多对多
morphToMany
(文章/视频 - 标签)
模型关联预加载
1 | $books = App\Book::with('author')->get(); |
1 | $books = load('author', 'publisher'); |
模型关联计数
1 | $posts = App\Post::withCount('commnets')->get(); |
模型的scope
定义
1 | public function scopeActive($query) |
使用
1 | $users->App\User::popular()->active()->orderBy('created_at')->get(); |