programing

Larabel Migration을 사용하여 타임스탬프 열의 기본값을 현재 타임스탬프로 설정하려면 어떻게 해야 합니까?

prostudy 2022. 10. 3. 16:07
반응형

Larabel Migration을 사용하여 타임스탬프 열의 기본값을 현재 타임스탬프로 설정하려면 어떻게 해야 합니까?

.CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPLaravel Schema Builder / Migrations lar lar lar 。Laravel 문서를 여러 번 살펴보았는데, 타임스탬프 열의 기본값을 어떻게 해야 할지 모르겠습니다.

timestamps() 은 「 「 」로 설정합니다.0000-00-00 00:00두 기둥 모두 사용할 수 있습니다.

표현이이기 때문에, 이 표현은 given색 、 신색 、 신신 、 당 given 、 당 given 、 given given 、 given given given given given given 。DB::raw()CURRENT_TIMESTAMP이치노

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

이것은 모든 데이터베이스 드라이버에서 완벽하게 작동합니다.

Larabel 5.1.25(PR 10962 15c487fe참조) 이후 새로운 버전을 사용할 수 있게 되었습니다.useCurrent()컬럼 수식자 메서드를 사용하여 컬럼에 대해 동일한 기본값을 얻을 수 있습니다.

$table->timestamp('created_at')->useCurrent();

에서는 "MySQL"을할 수도 있습니다.ON UPDATE에서 절로 하다DB::raw():

$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

다시 말씀드리지만 Laravel 8.36.0(PR 36817 참조)에서 새로운 버전을 사용할 수 있게 되었습니다.useCurrentOnUpdate() 및 수식자 메서드useCurrent()컬럼에 대해 동일한 기본값을 얻기 위한 수식자:

$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();

고차스

  • MySQL

    .7 MySQL 5.7 ★0000-00-00 00:00:00유효한 날짜로 간주되지 않습니다.Larabel 5.2 업그레이드가이드에 기재되어 있는 바와 같이 레코드를 데이터베이스에 삽입하면 모든 타임스탬프 컬럼에 유효한 디폴트값이 표시됩니다.를 사용할 수 있습니다.useCurrent()시 컬럼 수식자5.를 사용하여 (Larabel 5.1.25)를 수 .nullable()값을 합니다.

  • PostgreSQL © Larabel 4.x

    4. 4.x "Postgre"SQL 드라이버는 타임스탬프 값을 저장하기 위해 기본 데이터베이스 정밀도를 사용했습니다.「 」를 하는 CURRENT_TIMESTAMP기본 정밀도로 열에서 함수 PostgreSQL은 사용 가능한 더 높은 정밀도로 타임스탬프를 생성하므로 소수 두 번째 부분으로 타임스탬프를 생성합니다. 이 SQL 피들링을 참조하십시오.

    카본은 마이크로초가 저장될 것으로 예상하지 않기 때문에 타임스탬프 해석에 실패합니다.치 않은 것을 는 어플리케이션에 으로 부여해야 .CURRENT_TIMESTAMP"이것들"은 다음과 같습니다.

      $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
    

    5.이이라벨 5.0 이후timestamp()기둥 0이를 막을 수 있는 생략성 정밀도를 사용하여로 변경되었다.

Larabel 4.x 문제를 지적해 주신 @andrewhl님 감사합니다.

@Chanaka Karunarathne 님의 신작 소개에 감사드립니다.useCurrentOnUpdate()숏컷이 있어요

created_at ★★★★★★★★★★★★★★★★★」updated_at§:

$t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

MySQL version > = 5.6. MySQL = 5.6.5인 것이 합니다.CURRENT_TIMESTAMP

태그 Laravel 5.1 2015-12-02 -에 lar lar lar lar lar lar lar lar lar lar lar5 . 1 . 26 ★useCurrent()이치노

Schema::table('users', function ($table) {
    $table->timestamp('created')->useCurrent();
});

PR 10962(이후 커밋 15c487fe)가 이 추가로 이어졌습니다.

관심 있는 문제 360211518을 읽어보실 수도 있습니다.

기본적으로 MySQL 5.7(기본 구성)에서는 시간 필드에 기본값을 정의하거나 null을 정의해야 합니다.

미래의 구글 이용자를 위한 추가 가능성으로

레코드가 작성되었지만 수정되지 않은 경우 updated_at 열에 null이 있으면 더 편리합니다.db 크기를 줄이고(오케이, 조금만), 데이터가 수정된 적이 없다는 것을 한눈에 알 수 있습니다.

다음과 같이 사용하고 있습니다.

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'))->nullable();

(라라벨 7+8에서는 mysql 8).


편집: Laravel 8부터 다음 기능도 사용할 수 있습니다.

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable()->useCurrentOnUpdate();

같은 결과를 얻을 수 있습니다.

이것을 지적해 주신 @bilogic 덕분입니다.

이것은 사실로 통하지 않는다.

$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');

타임스탬프 선택과 함께 제공되는 '기본값 0'은 제거되지 않고 사용자 정의 기본값만 추가됩니다.하지만 견적을 빼놓고는 그게 좀 필요해요.DB를 조작하는 모든 것이 Laravel4에서 나오는 것은 아닙니다.그게 그의 요점이야.다음과 같은 특정 열에 대한 사용자 지정 기본값을 원합니다.

$table->timestamps()->default('CURRENT_TIMESTAMP');

라라벨과 함께라면 불가능할 것 같아그게 가능한지 보려고 한 시간째 찾고 있어요.


업데이트: Paulos Freita의 답변은 가능하지만 구문은 간단하지 않습니다.

대신 Paulo Freitas 제안을 사용하십시오.


이 문제를 할 때까지 Larabel 뒤에 할 수 .Schema::create실행되었습니다.

    Schema::create("users", function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('given_name', 100);
        $table->string('family_name', 100);
        $table->timestamp('joined');
        $table->enum('gender', ['male', 'female', 'unisex'])->default('unisex');
        $table->string('timezone', 30)->default('UTC');
        $table->text('about');
    });
    DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");

나한테는 놀라운 효과가 있었어.

현재 시간을 설정하려면 레벨 7, 8에서 다음을 사용합니다.

$table->timestamp('column_name')->useCurrent();

dateTime 열의 현재 날짜/시간을 설정하려면 다음과 같이 하십시오(검색할 때처럼).

$table->dateTime('signed_when')->useCurrent();

Larabel에서 사용하는 커스터마이즈는 다음과 같습니다.

  1. 현재 타임스탬프의 기본 created_at
  2. 레코드 업데이트 시 타임스탬프 업데이트

파일을helpers.php라라벨

<?php

if (!function_exists('database_driver')) {
    function database_driver(): string
    {
        $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에는 다음 내용을 composerautoload조력자php php php php php php php php php php php php php php php 。

    "autoload": {
        "files": [
            "app/Services/Uploads/Processors/processor_functions.php",
            "app/helpers.php"
        ]
    },

저는 라라벨 모델에 다음과 같은 것을 사용하고 있습니다.

        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_TIMESTAMPMySQL sqlite 에iteite 。

이렇게 하면 됩니다.확인해보니 제 Laravel 4.2에서 동작합니다.

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

이게 도움이 됐으면 좋겠다.

나한테 효과가 있었던 건

DB::statement("ALTER TABLE orders CHANGE updated_at updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP");

Larabel 5에서는, 다음과 같이 심플합니다.

$table->timestamps(); //Adds created_at and updated_at columns.

문서: http://laravel.com/docs/5.1/migrations#creating-columns

언급URL : https://stackoverflow.com/questions/18067614/how-can-i-set-the-default-value-of-a-timestamp-column-to-the-current-timestamp-w

반응형