主页/PHP笔记/PHP问答/框架Laravel/在 Laravel Eloquent 中更改 created_at 和 updated_at 字段的格式

在 Laravel Eloquent 中更改 created_at 和 updated_at 字段的格式

Bug编译狮

Bug编译狮

在 Laravel Eloquent 中,你可以通过重写模型的 created_atupdated_at 属性来改变它们的默认格式。以下是如何实现这一点的步骤:

  1. 创建一个新的迁移文件: 首先,你需要创建一个新的迁移文件来修改数据库表结构。

    php artisan make:migration add_custom_date_format_to_users_table --table=users
  2. 编辑生成的迁移文件: 打开生成的迁移文件(例如 2023_04_01_123456_add_custom_date_format_to_users_table.php),并添加以下代码来重写 created_atupdated_at 字段的格式:

    use IlluminateDatabaseMigrationsMigration;
    use IlluminateDatabaseSchemaBlueprint;
    use IlluminateSupportFacadesSchema;
    
    class AddCustomDateFormatToUsersTable extends Migration
    {
       public function up()
       {
           Schema::table('users', function (Blueprint $table) {
               $table->dateTime('created_at')->format('Y-m-d H:i:s');
               $table->dateTime('updated_at')->format('Y-m-d H:i:s');
           });
       }
    
       public function down()
       {
           Schema::table('users', function (Blueprint $table) {
               $table->dateTime('created_at');
               $table->dateTime('updated_at');
           });
       }
    }
  3. 运行迁移: 运行迁移以应用更改到数据库表结构。

    php artisan migrate
  4. 验证更改: 你可以通过查询数据库来验证 created_atupdated_at 字段是否已经按预期格式存储。

    use AppModelsUser;
    
    $user = User::find(1);
    echo $user->created_at; // 输出: 2023-04-01 12:34:56
    echo $user->updated_at; // 输出: 2023-04-01 12:34:56

通过这种方式,你可以在 Laravel Eloquent 中灵活地更改 created_atupdated_at 字段的格式,使其符合你的需求。

黑板Bug讲师

黑板Bug讲师

概览

Laravel 很受好评,因为它优雅地处理数据库操作,很大程度上归功于内置的ORM(对象关系映射)Eloquent。在 Web 开发中,格式化或修改日期列(如 created_at、updated_at 等)是一个常见的需求。created_atandupdated_at在使用Eloquent模型时,本教程将指导您如何在Laravel应用程序中更改这些时间戳的日期格式。

理解Laravel时间戳

默认情况下,Laravel 使用的是 PHP 的核心函数库。IlluminateSupportCarbon类继承自PHP的DateTime类,用于处理日期和时间。启用时,Eloquent会填充timestamps字段。created_atand 是中文里表示“并且”的意思。updated_at在“Y-m-d H:i:s”格式下,显示当前日期和时间。

好的,让我们从基础开始,然后逐步进行更高级的定制化设置。

使用Accessors进行基本格式化

最简单的方式来自定义格式化方式就是通过在Eloquent模型中的访问器来实现。访问器允许你在访问时对Eloquent属性值进行格式化。

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    protected function getCreatedAtAttribute($value)
    {
        return CarbonCarbon::parse($value)->format('d-m-Y H:i:s');
    }

    protected function getUpdatedAtAttribute($value)
    {
        return CarbonCarbon::parse($value)->format('d-m-Y H:i:s');
    }
}

使用上述代码,每当您访问时,都会触发。$post->created_at哦,是吗?$post->updated_at对不起,我不明白你的意思。Post例如,您会收到日期以“d-m-Y H:i:s”格式。

使用$casts进行全球定制化

另一种方法是通过在模型中全局定义自己的日期格式来实现。$casts已收到指令,请提供需要翻译的内容。

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    protected $casts = [
        'created_at' => 'datetime:d-m-Y H:i:s',
        'updated_at' => 'datetime:d-m-Y H:i:s',
    ];
}

这将在指定的日期格式生效时自动应用。created_at哦,是的。updated_at属性被转换为日期或日期时间数据类型。

使用日期序列化器进行自定义序列化

如果想要全局自定义日期的序列化,可以重写该方法。serializeDate在你的模型中,有一个方法来确定如何序列化日期属性,当将Eloquent模型转换为数组或JSON时。

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

use DateTimeInterface;

class Post extends Model
{
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('d-m-Y H:i:s');
    }
}

现在,每当有一条消息传入,我都会收到通知。Post模型转换为JSON或数组,那么?created_atand也是,有什么可以帮到你的吗?updated_at属性将根据指定的格式进行格式化。

修改默认的日期时间格式

如果需要更改默认的时间戳格式,你可以设置。$dateFormat在你的Eloquent模型中添加属性到所需的格式。这会影响到数据库中日期属性的存储方式以及如何检索它们。

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    protected $dateFormat = 'd-m-Y H:i:s';
}

在改变时要小心。$dateFormat这种情况可能会对数据库中日期和时间的存储及解析方式产生影响。

结论。

在本教程中,您已经学习了多种格式化文本的方法。created_atand 是“和”的意思,通常用于连接两个词或短语。updated_at在Laravel使用Eloquent时,时间戳的处理方式。每个方法都有其用途,例如它是访问器、全局序列化还是直接修改。选择最适合您应用需求的方法。

长工码奴1523

长工码奴1523

在 Laravel Eloquent 中更改 created_atupdated_at 字段的格式,你可以使用以下方法:

  1. 首先,确保你在数据库表结构中设置了这些字段,并且它们的数据类型是正确的。

  2. 接下来,创建一个新的模型类,或者修改现有的模型类来添加这些新的日期时间字段。

  3. 在迁移文件中设置新的字段:

$table->timestamp('created_at');
$table->timestamp('updated_at');
  1. 然后,将这些新字段应用到你想要更新的表上:
$database = DB::connection();
$tables = $database->getSchemaBuilder()->listTables();

foreach ($tables as $table) {
    if (in_array($table['name'], ['users', 'posts'])) {
        $table->timestamp('created_at')->after('id');
        $table->timestamp('updated_at')->after('id');
    }
}
  1. 最后,使用 Eloquent 的 updateOrCreate() 方法来更新或创建新的记录时,同时更新这些日期时间字段:
$user = User::find(1);
if ($user) {
    $user->update([
        'created_at' => CarbonCarbon::now(),
        'updated_at' => CarbonCarbon::now(),
    ]);
} else {
    $user = new User;
    $user->create([
        'name' => 'John Doe',
        'email' => 'john.doe@example.com',
        'password' => bcrypt('secret'),
    ]);
    $user->save();
    $user->update([
        'created_at' => CarbonCarbon::now(),
        'updated_at' => CarbonCarbon::now(),
    ]);
}

在这个例子中,我们首先检查用户是否存在,然后如果存在就更新其 created_atupdated_at 信息。如果没有找到用户,我们就创建一个新的用户并将其保存,然后更新它的 created_atupdated_at 信息。