并非完美无缺。对于 PostgreSQL 'CURRENT_TIMESTAMP' 返回格式为:2014-08-11 15:06:29.692439。这会导致 Carbon::createFromFormat('Ymd H:i:s', $timestamp) 方法失败(它无法解析尾随毫秒)。这是 Laravel 在访问时间戳时使用的。要修复 PostgreSQL,请使用: DB::raw('now()::timestamp(0)') (参考:postgresql.org/docs/8.1/static/…)
我在 Laravel 中使用以下自定义:
默认 created_at 为当前时间戳更新记录时更新时间戳
首先,我将创建一个文件,helpers.php,在 Laravel 的根目录中并插入以下内容:
{ $connection = config('database.default'); return config('database.connections.' . $connection . '.driver'); } } if (!function_exists('is_database_driver')) { function is_database_driver(string $driver): bool { return $driver === database_driver(); } }在 composer.json 中,我将以下内容插入autoload.这允许作曲家自动发现 helpers.php。
"autoload": {
"files": [
"app/Services/Uploads/Processors/processor_functions.php",
"app/helpers.php"
]
},
我在我的 Laravel 模型中使用以下内容。
if (is_database_driver('sqlite')) {
$table->timestamps();
} else {
$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')
->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
}
这允许我的团队继续使用 sqlite 进行单元测试。ON UPDATE CURRENT_TIMESTAMP是 MySQL 快捷方式,在 sqlite 中不可用。