【问题标题】:Change name of Laravel's created_at and updated_at更改 Laravel 的 created_at 和 updated_at 的名称
【发布时间】:2014-08-15 18:27:05
【问题描述】:

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

created_at 到 post_date 和 post_date_gmt?

updated_at 到 post_modified 和 post_modified_gmt?


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

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

Posts 表有 post_date、post_date_gmt、post_modified 和 post_modified_gmt,但 Laravel 期待 created_at 和 updated_at。

是否可以更改 Laravel 查找的列名?

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

【问题讨论】:

    标签: php mysql laravel laravel-4


    【解决方案1】:

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

     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';
    }
    

    【讨论】:

    • 这个答案与接受的答案有何不同?
    【解决方案2】:

    如果您查看 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

    【讨论】:

    • 检查我的答案,因为这会导致意外行为。
    • 我再次查看了源代码,正如 deczo 所说,当涉及到使用静态常量的其他方法时,我提供的代码将导致错误。我更新了代码示例以反映 deczo 的建议。
    【解决方案3】:

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

    您最好覆盖模型上的 const:

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

    然后方法 getCreatedAtColumn 和 getUpdatedAtColumn 将分别返回 post_date 和 post_modified,但不会造成任何伤害。

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

    【讨论】:

    • 你能解释一下接受的答案会如何导致问题吗?我很感兴趣。
    • Eloquent Model 类在某些方法中引用 static::CREATED_AT 和 static::UPDATED_AT,在 @Oni 覆盖的特定 2 中也是如此。因此,在这些方法中对列进行硬编码将使 Eloquent 在更新时间戳时搜索created_at 和updated_at(例如updateTimestamps 方法)。当使用软删除时,DELETED_AT 也是如此。
    • 嗯,这似乎是 Laravel 中的一个可能的错误(因为它应该使用方法而不是常量),对吧?
    • 如果您覆盖 const,这是否只会影响您设置它们的模型,还是会覆盖它扩展的模型,从而影响所有模型?
    • 当然只有你设置它们的模型和所有从它继承的模型,但不是父类 - Eloquent\Model。
    【解决方案4】:

    您可以尝试使用属性 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');
        }
    }
    

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

    【讨论】:

    • 哦忽略这个,Oni 的好多了!
    • 这不是确切的解决方案。Laravel 已经为时间戳字段提供了常量。 @jarek-tkaczyk 给出了正确的解决方案
    猜你喜欢
    • 2021-10-26
    • 2014-08-17
    • 2018-09-16
    • 1970-01-01
    • 2016-04-05
    • 2019-01-22
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多