DB 테이블에 기본 timestamps 컬럼 외에 다른 날짜타입 컬럼 추가하기

Submitted by river - 등록 10 years ago - 수정 10 years ago

블로그 글을 담고 있는 posts 테이블이 있고, 다음과 같이 컬럼이 구성되어 있다.

Schema::create('posts', function($table)
{
    $table->increments('id');
    $table->string('title');
    $table->timestamps();

    // 마지막 수정일
    $table->timestamp('last_updated_at');
});

여기서 last_updated_at은 블로그 글의 최종 수정일을 담기 위해 추가한 timestamp 타입의 컬럼이다.

Laravel에서는 기본 timestamps 컬럼(created_at, updated_at, deleted_at)에 대해서 DB에서 값을 읽어 올 때, Carbon 객체로 변환을 해서 모델 객체에 담는다. 다음이 이에 대한 Laravel 소스이다.

Illuminate\Database\Eloquent\Model.phpasDateTime 메소드

/**
 * Return a timestamp as DateTime object.
 *
 * @param  mixed  $value
 * @return \Carbon\Carbon
 */
protected function asDateTime($value)
{
    // If this value is an integer, we will assume it is a UNIX timestamp's value
    // and format a Carbon object from this timestamp. This allows flexibility
    // when defining your date fields as they might be UNIX timestamps here.
    if (is_numeric($value))
    {
        return Carbon::createFromTimestamp($value);
    }

    // If the value is in simply year, month, day format, we will instantiate the
    // Carbon instances from that format. Again, this provides for simple date
    // fields on the database, while still supporting Carbonized conversion.
    elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value))
    {
        return Carbon::createFromFormat('Y-m-d', $value)->startOfDay();
    }

    // Finally, we will just assume this date is in the format used by default on
    // the database connection and use that format to create the Carbon object
    // that is returned back out to the developers after we convert it here.
    elseif ( ! $value instanceof DateTime)
    {
        $format = $this->getDateFormat();

        return Carbon::createFromFormat($format, $value);
    }

    return Carbon::instance($value);
}

기본 timestamps 컬럼외에 사용자가 추가한 timestamp 컬럼에 대해서 Carbon 객체로의 변환이 이루어지게 하기 위해서는 Post 모델 객체에 $dates 프로퍼티를 지정해 줘야 한다.

class Post extends Model
{

   /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['last_updated_at'];

}

관련글

comments powered by Disqus