Laravel 마이그레이션을 통해 타임 스탬프 열의 기본값을 현재 타임 스탬프로 설정하려면 어떻게해야합니까?
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Laravel Schema Builder / Migrations 를 사용 하는 기본값으로 타임 스탬프 열을 만들고 싶습니다 . 라 라벨 문서를 여러 번 살펴 봤는데 어떻게 타임 스탬프 열의 기본값으로 만들 수 있는지 알 수 없습니다.
이 timestamps()
함수는 0000-00-00 00:00
두 열을 모두 기본값 으로 설정합니다.
원시 표현식 인 경우 열의 기본값 DB::raw()
으로 설정 해야합니다 CURRENT_TIMESTAMP
.
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
이것은 모든 데이터베이스 드라이버에서 완벽하게 작동합니다.
새로운 지름길
Laravel 5.1.25 ( PR 10962 및 commit 15c487fe 참조 )에서 새로운 useCurrent()
열 수정 자 메소드를 사용하여 열의 CURRENT_TIMESTAMP
기본값 으로 설정할 수 있습니다 .
$table->timestamp('created_at')->useCurrent();
질문으로 돌아가서 MySQL에서는 다음 ON UPDATE
을 통해 절을 사용할 수도 있습니다 DB::raw()
.
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
잡았다
MySQL
MySQL 5.7부터는0000-00-00 00:00:00
더 이상 유효한 날짜로 간주되지 않습니다. 상기 설명 된대로 Laravel 5.2 업그레이드 가이드 , 모든 타임 스탬프 열은 데이터베이스에 기록 삽입 유효한 기본값을 받아야합니다. 당신은 사용할 수 있습니다useCurrent()
현재 타임 스탬프에 타임 스탬프 열을 기본값으로하여 마이그레이션에 (Laravel 5.1.25에서 이상) 열 수정을하거나 타임 스탬프를 만들 수 있습니다nullable()
널 값을 허용 할 수 있습니다.PostgreSQL 및 Laravel 4.x
Laravel 4.x 버전에서 PostgreSQL 드라이버는 기본 데이터베이스 정밀도를 사용하여 타임 스탬프 값을 저장했습니다.CURRENT_TIMESTAMP
기본 정밀도가있는 열 에서 함수를 사용하는 경우 PostgreSQL은 사용 가능한 정밀도가 더 높은 타임 스탬프를 생성하므로 소수 부분으로 타임 스탬프를 생성합니다 ( 이 SQL 바이올린 참조) .이로 인해 카본은 마이크로 초가 저장 될 것으로 예상하지 않기 때문에 타임 스탬프를 구문 분석하지 못했습니다. 이 예기치 않은 동작으로 인해 응용 프로그램이 중단되지 않도록하려면
CURRENT_TIMESTAMP
다음과 같이 함수에 정밀도를 0 으로 지정해야합니다.$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Laravel 5.0부터
timestamp()
열을 기본 정밀도 0으로 변경하여이를 방지합니다.의견 에서이 문제를 지적 한 @andrewhl 에게 감사드립니다 .
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 버전> = 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 (기본 구성)은 기본값 또는 시간 필드에 대해 널 입력 가능을 정의해야합니다.
이것은 사실이 아닙니다.
$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');
타임 스탬프 선택과 함께 나타나는 'default 0'을 제거하지 않고 사용자 지정 기본값을 추가합니다. 그러나 우리는 따옴표없이 필요합니다. DB를 조작하는 모든 것이 Laravel4에서 나오는 것은 아닙니다. 이것이 그의 요점입니다. 그는 다음과 같은 특정 열에서 사용자 정의 기본값을 원합니다.
$table->timestamps()->default('CURRENT_TIMESTAMP');
라 라벨에서는 가능하지 않다고 생각합니다. 가능한지 확인하기 위해 한 시간 동안 검색했습니다.
업데이트 : Paulos Freita의 답변에 따르면 가능하지만 구문은 간단하지 않습니다.
대신 Paulo Freitas 제안을 사용하십시오 .
Laravel이이 문제를 해결하기 전까지는 표준 데이터베이스 쿼리를 실행 한 후에 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");
그것은 나를 위해 놀라운 일을했다.
I used this for laravel 5.X, on the users table created_at to set the timestamps automatically on record creation. (we have a client that wants to input users directly in the DB so I had to make sure the timestamps got set)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Carbon\Carbon;
class UpdatingUserTableTimeStampsForAccuracy extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->dateTime('created_at')->change()->default(\Carbon\Carbon::now());
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dateTime('created_at')->change();
});
}
}
Use that line if you are doing a change migration.
If you are a fan of Carbon, this works great!
Or if you are setting this in your table creation migration.
$table->dateTime('created_at')->default(\Carbon\Carbon::now());
This is how you do it, I have checked it and it works on my Laravel 4.2.
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Hope this helps.
In Laravel 5 simply:
$table->timestamps(); //Adds created_at and updated_at columns.
Documentation: http://laravel.com/docs/5.1/migrations#creating-columns
Usethe following:
$table->timestamp('created_at')->nullable();
Hopefully, it will help you. Thank you.
'IT story' 카테고리의 다른 글
MySQL Workbench : 연결을 유지하는 방법 (0) | 2020.06.24 |
---|---|
Django 1.7-변경 사항을 감지하지 못하는 마이그레이션 (0) | 2020.06.23 |
angularjs에서 날짜 형식을 지정하는 방법 (0) | 2020.06.23 |
다형성 : 왜“ArrayList list = new ArrayList”대신“List list = new ArrayList”를 사용합니까? (0) | 2020.06.23 |
Vim : 분할 창을 잃지 않고 버퍼 삭제 (0) | 2020.06.23 |