更改Laravel的created_at和updated_at的名称

时间:2014-06-25 09:06:13

标签: php mysql laravel laravel-4

我可以从以下位置映射Laravel的时间戳:

created_atpost_datepost_date_gmt

updated_atpost_modifiedpost_modified_gmt


我正在将Wordpress应用程序迁移到Laravel。

我正在使用Laravel访问Wordpress数据库的副本。数据库的实时版本仍在使用中,因此我不想更改架构。

帖子表格包含post_datepost_date_gmtpost_modifiedpost_modified_gmt,但Laravel期待created_atupdated_at

有没有改变Laravel寻找的列名?

我希望Laravel更新已经存在的所有列的时间戳。

4 个答案:

答案 0 :(得分:63)

不幸的是,接受的答案可能会导致更新时间戳的问题。

您最好覆盖模型上的consts:

const CREATED_AT = 'post_date';
const UPDATED_AT = 'post_modified';

然后方法getCreatedAtColumngetUpdatedAtColumn将分别返回post_datepost_modified,但不会造成任何伤害。

对于其他列,您需要使用@Oni建议的事件。

答案 1 :(得分:19)

如果你查看Eloquent类的来源

https://github.com/illuminate/database/blob/4.2/Eloquent/Model.php#L223-L235

您应该可以通过覆盖这些常量来轻松更改这些列名。

<?php

class YourModel extends Eloquent {

    /**
     * The name of the "created at" column.
     *
     * @var string
     */
    const CREATED_AT = 'post_date';

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

}

对于这些时间戳的_gmt版本,您可能需要查看events。这是一个好的开始

http://driesvints.com/blog/using-laravel-4-model-events

答案 2 :(得分:0)

您可以尝试使用getters和getters属性:

class Post extends Eloquent
{
    public function getCreatedAtAttribute()
    {
        return $this->attributes['post_date'];
    }

    public function setCreatedAtAttribute($value)
    {
        $this->attributes['post_date'] = $value;

        // this may not work, depends if it's a Carbon instance, and may also break the above - you may have to clone the instance
        $this->attributes['post_date_gmt'] = $value->setTimezone('UTC');
    }
}

我不知道这是否有效,但你可以试一试。当然可能是一个基础 - 你必须要玩它。

答案 3 :(得分:0)

只需将其放入表格模型文件中

 const CREATED_AT = 'your_custom_created_at_field_name';
 const UPDATED_AT = 'your_custom_updated_at_field_name';

我的模型看起来像这样以避免混淆

class diarymodule extends Model
{
    protected $table = 'diarymodule';
    const CREATED_AT = 'CreatedDate';
    const UPDATED_AT = 'UpdatedDate';
}