Laravel Model[模型]

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
2
3
4
5
6
7
8
9
10
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

}

Eloquent 模型约定

数据表名称

1
2
3
4
5
6
/**
* 与模型关联的表名
*
* @var string
*/
protected $table = 'my_posts';

主键

Eloquent 也会假设每个数据表都有一个名为 id 的主键列。你可以定义一个受保护的 $primaryKey 属性来重写约定。

此外,Eloquent 假设主键是一个自增的整数值,这意味着默认情况下主键会自动转换为 int 类型。如果您希望使用非递增或非数字的主键则需要设置公共的 $incrementing 属性设置为 false。如果你的主键不是一个整数,你需要将模型上受保护的 $keyType 属性设置为 string

时间戳

默认情况下,Eloquent 预期你的数据表中存在 created_atupdated_at 。如果你不想让 Eloquent 自动管理这两个列, 请将模型中的 $timestamps 属性设置为 false:

1
2
3
4
5
6
/**
* 指示模型是否自动维护时间戳
*
* @var bool
*/
public $timestamps = false;

如果需要自定义时间戳的格式,在你的模型中设置 $dateFormat 属性。这个属性决定日期属性在数据库的存储方式,以及模型序列化为数组或者 JSON 的格式:

1
2
3
4
5
6
/**
* 模型日期列的存储格式。
*
* @var string
*/
protected $dateFormat = 'U';

如果你需要自定义存储时间戳的字段名,可以在模型中设置 CREATED_ATUPDATED_AT 常量的值来实现:

1
2
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';

数据库连接

默认情况下,Eloquent 模型将使用你的应用程序配置的默认数据库连接。如果你想为模型指定一个不同的连接,设置 $connection 属性:

1
2
3
4
5
6
/**
* 模型的连接名称
*
* @var string
*/
protected $connection = 'connection-name';

默认属性值

如果要为模型的某些属性定义默认值,可以在模型上定义 $attributes 属性:

1
2
3
4
5
6
7
8
/**
* 模型的默认属性值。
*
* @var array
*/
protected $attributes = [
'delayed' => false,
];

插入 & 更新模型

批量赋值

你也可以使用 create 方法来保存新模型,此方法会返回模型实例。不过,在使用之前,你需要在模型上指定 fillableguarded 属性,二者选其一,因为所有的 Eloquent 模型都默认不可进行批量赋值。

当用户通过 HTTP 请求传入一个意外的参数,并且该参数更改了数据库中你不需要更改的字段时。比如:恶意用户可能会通过 HTTP 请求传入 is_admin 参数,然后将其传给 create 方法,此操作能让用户将自己升级成管理员。

所以,在开始之前,你应该定义好模型上的哪些属性是可以被批量赋值的。你可以通过模型上的 $fillable 属性来实现。 例如:让 Post 模型的 titlecontent 属性可以被批量赋值:

1
2
3
4
5
class Post extends Model
{
protected $guarded = [];// 不可以注入的字段数据
//protected $fillable = ['title', 'content'];// 可以注入的字段数据
}

如果没有不需要注入的字段,用 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
2
3
4
public function scopeActive($query)
{
return $query->where('active', 1);
}

使用

1
$users->App\User::popular()->active()->orderBy('created_at')->get();
0%