programing

Laravel에서 created_at만 사용하는 방법

goodsources 2022. 9. 14. 22:32
반응형

Laravel에서 created_at만 사용하는 방법

created_at만 사용하고 싶은데 어떻게 해야 하나요?

알고 있습니다.

타임스탬프 이름을 커스텀할 수 있습니다.

const CREATED_AT = 'created';
const UPDATED_AT = 'updated';

그러면 타임스탬프가 비활성화됩니다.

public $timestamps = false;

할 수 있는 이 있는 것은 , 수 .만만만, 이이이이직직 , ,,creating다음 중 하나:

class User extends Eloquent {

    public $timestamps = false;

    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->created_at = $model->freshTimestamp();
        });
    }

}

맨 위에 사용:

const UPDATED_AT = null;

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

const CREATED_AT = null;

LARAVEL 5.5.0 - 5.5.5 업데이트

이 문제는 Larabel 5.5.0에서 해결되었습니다(5.5.5에서 다시 해결).

5.5.x 를 사용하고 있는 경우는, 최신 버전을 사용해 주세요.

어떤 이유로 인해 최신 버전을 사용할 수 없는 경우 다음 해결 방법이 있습니다.

public $timestamps를 false로 설정합니다.

public $timestamps = false;

필요한 경우:

public function setCreatedAtAttribute($value) { 
    $this->attributes['created_at'] = \Carbon\Carbon::now(); 
}

또는

public function setUpdatedAtAttribute($value) { 
    $this->attributes['updated_at'] = \Carbon\Carbon::now(); 
}

"created_at" 및 "updated_at" 두 개의 필드가 필수인 경우 물론 아무것도 수행할 필요가 없습니다.

Larabel 5.2 이상에 대한 더 나은 답변이 있습니다.

이것을 모델에 사용할 수 있습니다.

class User extends Model
{
    public $timestamps = false; // disable all behavior
    public $timestamps = true; // enable all behavior
    public $timestamps = [ "created_at" ]; // enable only to created_at
    public $timestamps = [ "updated_at" ]; // enable only to updated_at
    public $timestamps = [ "created_at", "updated_at" ]; // same as true, enable all behavior
}

그래서, 당신의 질문에 대한 답은...

public $timestamps = [ "created_at" ]; // enable only to created_at

재작성하다

public $timestamps = [ "created_at" ]; 

Larabel 6+에서는 동작하지 않는다.

솔루션:

class CreatePostsTable extends Migration {

   public function up() {

      Schema::create('posts', function(Blueprint $table){

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

난 이거면 돼

Larabel 5.* 이후

모델:

//  Disable updated_at (only created_at)
class Book extends Model
{
     const UPDATED_AT = null;

     /* ... */
}

이행:

Schema::create('books', function (Blueprint $table): void {
    /* ... */
    $table->timestampTz('created_at')->nullable();
});

요.CURRENT_TIMESTAMP 컬럼의 "My database" ()created_at 제 하고 있습니다.

public $timestamps = false;
protected $dates = ['created_at'];

나는 이 방법이 모든 버전의 라라벨에서 효과가 있기를 바란다.

★★★★★★★★★★★★★★★★★★★★★★★에model 설정하다

const UPDATED_AT = null;

또는

const CREATED_AT = null;

Laravel이 updated_at/created_at 필드의 갱신을 시도하지 않도록 합니다.

Laravel 5.8에 대응합니다.

.setUpdatedAt 안에서model

public function setUpdatedAt($value) : self 
{
    // Do nothing.
    return $this;
}

는 이 체크가 짧기 때문입니다.또, 「」의 때문입니다.if (! is_null(static::UPDATED_AT) 것은, 「 」를 트리거 에.setUpdatedAt

updated_at만 비활성화하려면 다음과 같이 Model::setUpdatedAt() 메서드를 덮어씁니다.

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

물론 created_at 열에 대해 이 작업을 수행하는 경우에도 간단합니다.그게 라라벨 5.1의 작업입니다.

5. 5.3을 .public $timestamps = false;그런 다음 protected $fillable = ['created_at']를 추가합니다.주의: 원하는 것을 추가할 수 있습니다.테이블에 있는 것과 일치하는지 확인해 주세요.

저의 은 새로운 입니다.__construct★★★★★★ 。

참조:

class MyModel extends Eloquent {

    public $timestamps = false;

    public function __construct(array $attributes = [])
    {
            parent::__construct($attributes);

            $this->attributes['created_at'] = $this->freshTimestamp();
    }
}

「 」으로 .setUpdatedAt5.1하지 않았습니다.왜냐하면 Laravel 5.1.7이 있는 더 입니다.이치노라라벨 5.1.7입니다.updated_at리됩니니다다

모델 클래스 performUpdate 메서드가 Builder 클래스 메서드를 호출합니다.

public function update(array $values)
{
    return $this->query->update($this->addUpdatedAtColumn($values));
}

그 결과,

return Arr::add($values, $column, $this->model->freshTimestampString());

를 두 번 Larabel에서.performUpdate$this->updateTimestamps() 후 Builder에서 "Builder"를 합니다.$this->addUpdatedAtColumn($values).

디버깅을 해보니 getUpdatedAtColumn 덮어쓰기로 모델도 업데이트해야 합니다.처음에는 존재하지 않는 필드 "null"을 업데이트하려고 할까 봐 걱정했는데 알고 보니Arr::addnull 키를 무시할 정도로 스마트합니다.

따라서 모델 클래스에 다음 항목을 추가합니다.

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

public function getUpdatedAtColumn()
{
    return null;
}

이것으로, 양쪽의 업데이트를 무효로 할 수 있습니다.

맨 위에서 클래스 사용:

const UPDATED_AT = null;

또는

const CREATED_AT = null;

단순하고 분리되며 재사용 가능한 솔루션은 모델 옵서버를 사용하는 것입니다.이 아이디어는 이 모든 것을creating이벤트 및 채우기created_at기여하다.이 방법은 코드를 반복하거나 비공식적인 방법을 사용하지 않고도 다양한 모델에서 사용할 수 있습니다.가장 중요한 것은 모델 클래스의 내부 메커니즘과 매우 유사하기 때문에 예상치 못한 오류를 방지할 수 있다는 점입니다.

1) 작성SetCreatedAt을 관찰하다.App\Observers:

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;

class SetCreatedAt
{
    /**
     * Sets created_at when creating the model.
     *
     * @param Model $model
     * @return void
     */
    public function creating(Model $model)
    {
        $model->setCreatedAt($model->freshTimestamp());
    }
}

2) 온App\Providers\AppServiceProvider내부bootmethod를 사용하여 원하는 각 모델에 대해 다음 행을 추가합니다.created_at생성 대상:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    // Replace OrderLog with your model
    OrderLog::observe(SetCreatedAt::class);
}

3) 모델에서는 타임스탬프를 비활성화하기만 하면 됩니다.

// Disable timestamps on the model
public $timestamps = false;

Larabel 5.3에서 테스트했지만 이전 버전에서도 동작합니다.

행운을 빕니다.

Larabel 5.7에서는 이 정도면 충분했습니다.

이행 시:

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

클래식 대신$table->timestamp('created_at');

모델 내:

const UPDATED_AT = null;

5.4에서는 업데이트 후에도 updated_at 필드(Eloquent 업데이트)가 채워지지 않는 문제가 발생합니다.

대신 이 메서드를 추가합니다.

public function setUpdatedAtAttribute($value)
{
    // auto disable update_at in inserts 
}

여기 계신 분들을 위해updated_at가 아니라created_at하지만 다른 답변은 전혀 도움이 되지 않는 것 같습니다.

Laravel 8에서는 모델 속성을 설정해야 합니다.CREATED_AT로.null및 그UPDATED_AT'supdated_at' 또는 updated_at 필드에 추가할 다른 이름을 지정합니다.

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The name of the "created at" column.
     *
     * @var string|null
     */
    const CREATED_AT = null;

    /**
     * The name of the "updated at" column.
     *
     * @var string|null
     */
    const UPDATED_AT = 'updated_at';


    public function setCreatedAt($value)
    {
        // do nothing
    }
}

이행은...

Schema::create('users', function (Blueprint $table) {
    // ...
    $table->timestamp('updated_at'); // instead of $table->timestamps();
});

이 속성은 이미 상위 클래스에 설정되어 있으므로 모델 내에서 설정해야 하는 이유를 알 수 없습니다.Illuminate\Database\Eloquent\Model하지만 이 변경을 한 후에야 효과가 있었습니다.

CURRENT_TIMESTamp 기본값을 다음에 사용할 수 있습니다.createdMySQL 테이블 및 세트의 필드

public $timestamps = false;

를 선택합니다.

매우 간단한 해킹을 사용했어요;)

클래스 MyClass는 모델 {을(를) 확장합니다.

const CREATED_AT = 'creation_date';
const UPDATED_AT = 'creation_date';

}

양쪽을 같은 컬럼으로 가리켰을 뿐입니다.

언급URL : https://stackoverflow.com/questions/29886497/how-to-only-use-created-at-in-laravel

반응형