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

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

timestamps()함수가 디폴트를 설정합니다.0000-00-00 00:00두 기둥 모두 사용할 수 있습니다.



질문에 대한 답변



원색적인 표현이기 때문에, 당신은 그것을 사용해야 합니다.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

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

  • PostgreSQL 및 Larabel 4.x

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

    카본은 마이크로초가 저장될 것으로 예상하지 않기 때문에 타임스탬프 해석에 실패합니다.이 예기치 않은 동작을 방지하려면 응용 프로그램을 중단시켜야 합니다.CURRENT_TIMESTAMP다음과 같이 기능합니다.

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

    Larabel 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.5가 필요합니다.CURRENT_TIMESTAMP




2015-12-02에 태그된 Laravel 5.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의 답변은 가능하지만 구문은 간단하지 않습니다.