laravel 5,如何自动处理created_at但不处理updated_at

时间:2015-04-27 12:04:18

标签: laravel eloquent laravel-5

如在laravel的文档中所述,eloquent可以处理created_at和updated_at字段,如果我想要laravel只处理created_at,并保留updated_at,那会怎样?

3 个答案:

答案 0 :(得分:5)

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
}

答案 1 :(得分:0)

实现上述方法的一种方法是改变模型事件。将以下方法添加到模型中。

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

答案 2 :(得分:0)

开箱即用功能的全部或全部。

复制created_at的功能,您可以使用雄辩的事件。对于您的每个型号,您可以执行以下操作

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列设置为当前时间。