我刚刚发现,在更新模型时(让我们说$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();
}
}
答案 0 :(得分:1)
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"');
});
}