CodeIgniter4 日期自动更新 useTimestamps

在 CodeIgniter4 中,如果想要 Model 在创建及更新数据时自动更新对应的日期字段,可以使用 useTimestamps。但是有很多人会遇到遇到一些问题,其中最主要的问题是数据库字段与数据内容不匹配导致的。我们在设置了 $useTimestamps = true 后,往往忽略了与之配套使用的字段 dateFormat

一般的,我们在数据库中存储时间使用时间戳,我一般设置为 int UNSIGNED。大多人也是如此,在 CI4 中 dateFormat 的默认值为 datetime

1
2
3
4
5
6
7
8
9
case datetime:
$converted = $value->format(Y-m-d H:i:s);
break;
case date:
$converted = $value->format(Y-m-d);
break;
case int:
$converted = $value->getTimestamp();
break;

默认的日期格式为 2020-05-09 12:12:12 如果我们的数据会为 int 则数据会存储被为 2020 ,后边的信息无法存储。
所以我们需要将日期格式设置为 $dateFormat = int

CodeIgniter4 useSoftDeletes 软删除

做数据删除的时候,我们往往会用到软删除。CI4对这一功能进行了支持。

CI4 使用 deleted_at 字段是否为 NULL 来判断是数据是否被删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
protected $table = users;
protected $primaryKey = id;

protected $returnType = array;
protected $useSoftDeletes = true;

protected $allowedFields = [name, email];

protected $useTimestamps = false;
protected $createdField = created_at;
protected $updatedField = updated_at;
protected $deletedField = deleted_at;

protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
}

如果 useSoftDeletes 设置为 true, 则所有数据结果默认排除掉已经删除的数据,具体的做法是会在 SQL 语句中增加 deleted_at IS NULL 来进行数据的过滤。

有很多人在 GITHUB 发 ISSUES 表示自己的 useSoftDeletes 无法正常工作,实际上是因为我们默认习惯将 deleted_at 默认设置为 int, DEFAILT 0, NOT NULL。我们需要让 deleted_at 允许 NULL 并且默认为 NULL 。这样我们才能使用 useSoftDelets

如果我们希望返回的数据临时包括已删除的数据, 我们可以使用 withDeleted

如果我们希望返回的数据只包括已删除的数据,我们可以使用 onlyDeleted