기본값인 타임스탬프 열을 만들고 싶습니다.CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Laravel 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)가 이 추가로 이어졌습니다.
관심 있는 문제 3602 및 11518을 읽어보실 수도 있습니다.
기본적으로 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의 답변은 가능하지만 구문은 간단하지 않습니다.