Laravel의 Eloquent 타임 스탬프 비활성화


186

웹 응용 프로그램 중 하나를 CodeIgniter에서 Laravel으로 변환하는 중입니다. 그러나 현재이 모든 것을 이미 수행하는 로깅 클래스가 있으므로 현재 모든 테이블에 updated_at/ created_at필드 를 추가하고 싶지 않습니다 .

내가 설정할 수 있다는 것을 알고 있습니다 $timestamps = false;.

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

그러나 나는 오히려 라 라벨의 핵심 파일을 변경하지 않거나 내 모델의 모든 사람들이 맨 위에 그것을 갖도록하고 싶습니다. 모든 모델에서 다른 곳에서 이것을 비활성화하는 방법이 있습니까?

답변:


360

public $timestamps = false;모든 모델에서 선언 하거나 BaseModel을 작성하고 정의한 후 모든 모델을 웅변이 아닌 확장해야합니다. Eloquent를 사용하는 경우 피벗 테이블에는 타임 스탬프가 있어야합니다.

업데이트 : Laravel v3 이후 피벗 테이블에서 타임 스탬프가 더 이상 필요하지 않습니다.

업데이트 : $table->timestamps()마이그레이션에서 제거하여 타임 스탬프를 비활성화 할 수도 있습니다 .


1
내가 왜 BaseModel을하고 거기에 설정하려고 생각하지 않았는지 모르겠다. 아름답게 작동합니다. 문서 피벗 테이블에 따르면 메모는 이제 Timestamps ()로 설정 한 경우에만 필요합니다 (이전 버전에서 변경되었는지 알 수 없음)
projectxmatt

withTimestamps () 메소드를 인식하지 못했습니다. 나는 그것을 조사해야 할 것이다.
bgallagh3r

@ bgallagh3r, 어쨌든 perticuler 쿼리에 대한 diasble이 있습니까, fontend 디스플레이에 대해 타임 스탬프를 원하지 않지만 백엔드에 대해서는 타임 스탬프를 원합니다. 어쨌든 그렇게 할 수 있습니까?
user7747472

10
마이그레이션에서 $ table-> timestamps ()를 제거해도 eloquent는 여전히 쿼리에 포함합니다. 필드가 존재하지 않으므로 오류가 발생합니다. 그렇지 않으면 큰 대답입니다.
Thijs Steel

115

이 라인을 모델에 넣으십시오 .

public $timestamps = false;

그리고 그게 다야!


예:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

한 작업에서 타임 스탬프를 비활성화하려면 (예 : 컨트롤러에서) :

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

모든 모델에 대해 타임 스탬프를 비활성화하려면 새 BaseModel파일을 작성 하십시오.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

그런 다음을 사용하여 각 모델을 다음 BaseModel과 같이 확장하십시오 .

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

updated_at 업데이트 만 비활성화해야하는 경우이 방법을 모델에 추가하십시오.

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

이것은 부모 setUpdatedAtAttribute () 메소드를 대체합니다. created_at는 평소와 같이 작동합니다. created_at 업데이트 만 비활성화하는 방법을 작성할 수있는 것과 같은 방법입니다.


2
$ timestamps = false로 설정하면 더 이상 카본 인스턴스가 아니기 때문에 created_at-> diffForHumans () 메소드가 작동을 멈추게했기 때문에 이것은 나를 위해 일했습니다.
Nivin

그것은 나를 위해 작동합니다,이 방법은 내가 필요로하는 updated_at 필드를 비활성화합니다. 덕분에
Radames E. Hernandez

22

5.5.x를 사용하는 경우 :

const UPDATED_AT = null;

'created_at'필드에는 다음을 사용할 수 있습니다.

const CREATED_AT = null;

최신 버전인지 확인하십시오. (이것은 Laravel 5.5.0에서 중단되었으며 5.5.5에서 다시 수정되었습니다).


11

웅변 모델 :

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

아니면 단순히 이것을 시도하십시오

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

9

앞에서 언급했듯이 기존 모델에서 타임 스탬프를 제거하려는 경우이를 모델에 배치하십시오.

public $timestamps = false;

또한 up()메소드 에서 다음 코드로 마이그레이션을 작성 하고 실행하십시오.

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

당신은 사용할 수 있습니다 $table->timestamps()귀하의 down()롤백을 허용하는 방법.


1
이것이 가장 좋은 대답이어야합니다. 기존 프로덕션 데이터베이스가있는 경우 모델에서 타임 스탬프를 비활성화하고 마이그레이션을 실행해야합니다.
brad

7

단지 선언 public당신이에 타임 스탬프 변수 Modelfalse모든 것이 잘 작동합니다.

public $timestamps = false;


5

이 라인을 모델에 추가하십시오.

기존 변수를 $timestamps true 에서 false로 덮어 쓰기

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;

1

함수 setUpdatedAt()getUpdatedAtColumn()모델 재정의

public function setUpdatedAt($value)
{
   //Do-nothing
}

public function getUpdatedAtColumn()
{
    //Do-nothing
}

20
"작동하지만 제대로 된 사람은 없습니다."
developerbmw

1

타임 스탬프를 일시적으로 비활성화 할 수 있습니다

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.