2014-07-01 30 views
0

我剛剛發現,當更新模型(比如說$post模型)時,即更新正文文本和標題並點擊保存時,它會自動更新created_at列,但我希望它只更新updated_at列。Laravel 4更新模型並點擊保存時,只更新updated_at列

我已經搜索了很長時間才問,所以我知道$post->touch()只更新了時間戳,而沒有更新。當在我的後期模型中設置protected $timestamp = false;時,它僅更新/保存時禁用時間戳更新。

對於那些想知道的人,我目前仍在使用$post->save();來更新帖子。

那麼,有沒有人知道如何在更新/編輯帖子時保留created_at(將在創建帖子時設置)並更新updated_at

我之後的更新()控制器功能:

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(); 
    } 
} 
+0

究竟是什麼讓你認爲更新改變'created_at'列?它當然不會,所以顯示你的代碼和結果。 –

+0

我檢查了我的數據庫並將'created_at'列更新爲今天的日期。所以它肯定是.. – Jeroen

+0

就像我說的,如果您想要解決問題,請顯示代碼。 –

回答

1

我有同樣的問題。 問題出在創建表的mysql行爲上。 我創建timestap場這樣

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

和mysql它轉化爲具有自動autoupdating領域(我不知道爲什麼 - 但它沒有 - 我與phpMyAdmin選中)。所以laravel並沒有更新這個領域 - 它本身就是mysql。 我將字段創建更改爲

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

它有幫助。沒有「自動日期」了。

0

我剛碰到這個。 Vasiliy的回答讓我想到了我需要的地方,但它缺乏一個相當重要的細節。您要覆蓋的選項是列的更新,而不是默認值。

created_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp. 

我只是做了兩個ALTER TABLE命令,一個從創建到刪除的更新,而另一個將它添加到:我在我的,當我跑

show create table <table_name> 

我發現找到什麼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; 

進行這些更改解決我的問題,從而爲亞雷克說,這實際上不是一個Laravel問題。我的猜測是,如果您使用了遷移,Laravel會正確創建這些列。 (我自己還沒有使用遷移,因此我也可能遇到此問題。)

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