Laravel 4更新模型并点击保存时,只更新updated_at列

时间:2014-07-01 13:38:40

标签: php laravel-4 timestamp

我刚刚发现,在更新模型时(让我们说$post模型),即更新正文和标题并点击保存,它会自动更新created_at列,但我想它只能更新updated_at列。

我在询问之前已经搜了好一会儿,所以我知道$post->touch()只更新时间戳而不是其他时间戳。在我的帖子模型中设置protected $timestamp = false;时,它只会在更新/保存时禁用时间戳更新。

对于那些疑惑的人,我目前仍在使用$post->save();来更新帖子。

那么,是否有人知道如何保留created_at(在创建帖子时会设置)并在更新/编辑帖子时更新updated_at

我的帖子update()控制器功能:

public function update($slug)
{
    $post                   = Post::byslug($slug);
    $post->concept          = Input::get('concept');
    $post->title            = Input::get('title');
    $post->slug             = Str::slug(Input::get('title'));
    $post->body             = Input::get('body');
    $post->metatitle        = 'My Website |' . Input::get('title');
    $post->metadescription  = Input::get('body');
    $post->robots           = Input::get('robots');
    $post->ogtitle          = 'My Website |' . Input::get('title');
    $post->ogdescription    = Input::get('body');
    $post->ogsitename       = 'My Website';
    $post->ogurl            = Str::slug(Input::get('title'));
    $post->ogtype           = Input::get('ogtype');

    if(Input::hasFile('file'))
    {
        $file               = Input::file('file');
        $destinationPath    = 'uploads/images/posts/';
        $filename           = $file->getClientOriginalName();
        $upload_success     = $file->move($destinationPath, $filename);
        $post->image        = str_replace('\\', '/', $upload_success);
        $post->ogimage      = str_replace('\\', '/', $upload_success);
    }
    if($post->save())
    {
        return Redirect::route('admin.blog.index')
        ->with('post', $post);
    } else {
        return Redirect::route('admin.blog.edit')
        ->with('post', $post)
        ->withInput();
    }
}

3 个答案:

答案 0 :(得分:1)

我有同样的问题。 问题在于表创建时的mysql行为。 我像这样创建了时间戳字段

CREATE TABLE `tablename` (
...
`created_at` TIMESTAMP NOT NULL 
...

并且mysql将其转换为具有自动自动更新的字段(我不知道为什么 - 但它确实 - 我用phpmyadmin检查过)。所以laravel没有更新该字段 - 这是mysql本人。 我将字段创建更改为

... `created_at` TIMESTAMP NULL DEFAULT NULL ...

它有帮助。没有"自动更新日期"更多。

答案 1 :(得分:0)

我自己就碰到了这个。瓦西里的回答让我得到了我需要的地方,但它缺乏一个相当重要的细节。要覆盖的选项是列的更新,而不是默认值。当我跑步时,我在我的身上发现了什么

show create table <table_name>

我找到了:

created_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp.

我只是做了两个alter table命令,一个用于删除创建时的on更新,另一个用于将其添加到updated_at列。

ALTER TABLE <table_name> CHANGE created_at created_at timestamp NOT NULL DEFAULT current_timestamp;

ALTER TABLE <table_name> CHANGE updated_at updated_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp;

做出这些改变解决了我的问题,正如Jarek所说,它实际上并不是Laravel问题。我的猜测是,如果您使用过迁移,Laravel会正确创建这些列。 (我自己还没有使用迁移,因此我也可能遇到这个问题。)

答案 2 :(得分:0)

对@EpicWally的小更新 - 我不认为你需要将UPDATE添加到updated_at列 - laravel在内部处理它。

此外 - 如果您想通过迁移执行此操作:

public function up()
{
    Schema::table('posts', function(Blueprint $table)
    {
        DB::statement('ALTER TABLE `posts` CHANGE `created_at` `created_at` timestamp NOT NULL DEFAULT "0000-00-00 00:00:00"');
    });
}