Laravel 自定义 created_at 和 updated_at

Posted

技术标签:

【中文标题】Laravel 自定义 created_at 和 updated_at【英文标题】:Laravel custom created_at and updated_at 【发布时间】:2018-09-16 23:50:49 【问题描述】:

我正在尝试覆盖 created_at 和 updated_at 的 laravel eloquent 模型常量:

namespace App;

use Illuminate\Database\Eloquent\Model;

 class Visit extends Model
 
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
 

然后获取最新的条目:

dd(Visit::latest()->get());

但出现未知列错误:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'created_at' in 
'order clause' (SQL: select * from `visits` order by `created_at` desc)"

还有什么需要做的才能让它工作吗?

【问题讨论】:

【参考方案1】:

latest() 默认使用created_at。您必须自己指定列名:

Visit::latest(Visit::CREATED_AT)->get();

您可以通过将local scope 添加到您的Visit 模型来覆盖默认行为:

public function scopeLatest($query)

    return $query->orderByDesc(static::CREATED_AT);

更新:这将在 Laravel 5.7 中修复:https://github.com/laravel/framework/pull/24004

【讨论】:

就是这样,here's the source,列created_at 是硬编码的。 或者你可以做 Visit::latest('any_col_you_want')->get() ,但我喜欢 Jonas 的回答很好地把这一切联系在一起。 除了在 latest() 上指定列名之外,还有什么方法可以覆盖默认值?在源中那些默认值。在文档中,它说您可以逐个模型覆盖默认值。好像没用。 我扩展了我的答案。 谢谢!您是否对文档在此处引用的内容有任何线索:laravel.com/docs/5.6/eloquent 其中说:如果您需要自定义用于存储时间戳的列的名称,您可以在模型中设置 CREATED_AT 和 UPDATED_AT 常量: php class Flight extends Model const CREATED_AT = 'creation_date';常量 UPDATED_AT = 'last_update'; 【参考方案2】:

因为最新获取 created_at 默认情况下检查这里可能是here 和你一样的问题,同样的代码

【讨论】:

以上是关于Laravel 自定义 created_at 和 updated_at的主要内容,如果未能解决你的问题,请参考以下文章

使用 touch() 更新 laravel 中自定义时间戳字段的时间戳

Laravel 中 created_at 和 updated_at 列的优点是啥

laravel - 从数据库中删除 updated_at 和 created_at 列后,laravel 尝试插入它们

created_at 列中的时间不正确 - Laravel 5.4

Laravel 在 created_at 等所有模型上添加列值的方法

如何更新 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?