laravel 日期和时间列连接到日期时间列

laravel date and time column concat to datetime column

数据库设计过程中发生错误,日期时间在单独的字段中处理,我想使用迁移将其合并。 有没有一些简单的方法可以在不丢失现有数据的情况下将日期和时间字段中的数据移动到日期时间字段?

当前 table:

id | publish_date | publish_time
--------------------------------
1  | 2021-01-01   | 10:25:00

这就是我想要的样子,没有数据丢失:

id | publish_date_time
----------------------
1  | 2021-01-01 10:25:00

我想你正在找这个?使用可以使用 DB::raw 进行连接。

$articals = Artical::select("*", DB::raw("CONCAT(publish_date,' ', publish_time) as publish_date_time"))->get();

所以,结果你会得到

2021-01-18 04:10:35

迁移可用于执行此操作:

您可以使用 php artisan make:migration MergeDateColumns 创建一个,然后执行:

class MergeDateColumns extends Migration {
    public function up() {
       Schema::table('your table name', function (Blueprint $table) {
           $table->dateTime('publish_date_time');
       });
       DB::table('your table name')
           ->update([ 'publish_date_time' => DB::raw("CONCAT(publish_date,' ', publish_time)") ]);
       Schema::table('your table name', function (Blueprint $table) {
           $table->dropColumn('publish_date');
           $table->dropColumn('publish_time');
       });
    } 
    public function down() {
       Schema::table('your table name', function (Blueprint $table) {
           $table->date('publish_date');
           $table->time('publish_time');
       });
       DB::table('your table name')
           ->update([ 
              'publish_date' => DB::raw("DATE(publish_date_time)"),
              'publish_time' => DB::raw("TIME(publish_date_time)")
            ]);
       Schema::table('your table name', function (Blueprint $table) {
           $table->dropColumn('publish_date_time');
           $table->dropColumn('publish_time');
       });
    } 

}

这会在您迁移时合并列,并在您回滚时再次拆分它们。

为了安全起见,我会在生产 运行 之前对数据进行备份,但我认为这不会造成问题。

您可以通过以下代码(在方法中)简单地完成此操作:

$posts = Post::query()->selectRaw("id, concat(publish_date,' ', publish_time) as publish_date_time")->get();
    foreach ($posts as $post) {
        Post::query()->where("id", $post->id)->update([
            'publish_date_time' => $post->publish_date_time
        ]);
    }

确保您已经使用迁移

拥有“publish_date_time”列