【发布时间】:2015-07-05 21:03:23
【问题描述】:
正如 laravel 的文档中所说,eloquent 可以处理 created_at 和 updated_at 字段,如果我希望 laravel 只处理 created_at,而留下 updated_at 呢?
【问题讨论】:
标签: laravel eloquent laravel-5
正如 laravel 的文档中所说,eloquent 可以处理 created_at 和 updated_at 字段,如果我希望 laravel 只处理 created_at,而留下 updated_at 呢?
【问题讨论】:
标签: laravel eloquent laravel-5
实现上述方法的一种方法是更改模型事件。将以下方法添加到您的模型中。
public static function boot()
{
public $timestamps = false;
parent::boot();
static::creating(function($model) {
$dateTime = new DateTime;
$model->created_at = $dateTime->format('m-d-y H:i:s');
return true;
});
static::updating(function($model) {
$dateTime = new DateTime;
$model->updated_at = $dateTime->format('m-d-y H:i:s');
return true;
});
}
现在您可以访问创建和更新模型事件。在这些事件中,您可以做任何您想做的事情,在您的情况下,您可以更改时间戳。有关模型事件的更多信息,请参阅 Laravel 文档Model Events
【讨论】:
Eloquent 处理updateTimestamps() 中的时间戳:
protected function updateTimestamps()
{
$time = $this->freshTimestamp();
if ( ! $this->isDirty(static::UPDATED_AT))
{
$this->setUpdatedAt($time);
}
if ( ! $this->exists && ! $this->isDirty(static::CREATED_AT))
{
$this->setCreatedAt($time);
}
}
您可以简单地在模型中覆盖此函数并删除 updatedAt 部分:
protected function updateTimestamps()
{
$time = $this->freshTimestamp();
if ( ! $this->exists && ! $this->isDirty(static::CREATED_AT))
{
$this->setCreatedAt($time);
}
}
或者您可以直接覆盖 setUpdatedAt,尽管您可能希望保留它以有意设置值:
public function setUpdatedAt($value)
{
// do nothing
}
【讨论】:
开箱即用功能的全部或全部。
仅复制 created_at 的功能,您可以使用 eloquent 事件。对于您的每个模型,您可以执行以下操作
class MyModel extends Eloquent
{
protected $timestamps = false;
public static function boot()
{
parent::boot();
static::creating(function($model)
{
$model->created_at = Carbon::now();
});
}
}
每次创建新模型时,都会使用 Carbon 将 created_at 列设置为当前时间。
【讨论】: