Laravel 4 При обновлении модели и нажатии кнопки сохранить обновляйте только столбец updated_at

#php #laravel-4 #timestamp

#php #laravel-4 #временная метка

Вопрос:

Я только что узнал, что при обновлении модели (скажем, $post модели), то есть при обновлении основного текста и заголовка и нажатии кнопки сохранить, автоматически обновляется столбец created_at, но я бы хотел, чтобы он обновлял ТОЛЬКО столбец updated_at.

Я довольно долго искал, прежде чем спрашивать, поэтому я знаю $post->touch() , что обновлены только временные метки, а не остальные. И при настройке protected $timestamp = false; в моей модели post это просто отключает обновление метки времени при обновлении / сохранении.

Для тех, кому интересно, я в настоящее время все еще использую $post->save(); для обновления сообщения.

Итак, есть ли кто-нибудь, кто знает, как сохранить created_at (который будет установлен при создании сообщения) и обновлять updated_at при обновлении / редактировании сообщения?

Моя функция контроллера post 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();
    }
}
  

Комментарии:

1. Что, черт возьми, позволяет вам думать, что обновление изменяет created_at столбец? Это, конечно, не так, поэтому покажите свой код и результаты.

2. Я проверил свою базу данных, и столбец ‘created_at’ был обновлен до сегодняшней даты. Так оно и есть..

3. Как я уже сказал, покажите код, если вам нужна какая-либо помощь в решении вашей проблемы.

4. сделайте это: if($post->save()) { return DB::getQueryLog();} и проверьте выполненные запросы.

Ответ №1:

у меня была такая же проблема. проблема заключалась в поведении mysql при создании таблицы. я создал поле timestap следующим образом

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

и mysql преобразовал его в поле с автоматической автообновлением (я не знаю почему, но это произошло — я проверил с помощью phpmyadmin). итак, laravel не обновлял поле — это был сам mysql.
я изменил создание поля на

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

и это помогло. больше никаких «автоматически обновленных дат».

Ответ №2:

Я только что столкнулся с этим сам. Ответ Василия привел меня туда, где мне нужно было быть, но в нем отсутствовала довольно важная деталь. Параметр, который вы хотите переопределить, — это при обновлении для столбца, а не по умолчанию. Что я нашел в моем, когда я запустил

 show create table <table_name>
  

Я нашел:

 created_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp.
  

Я просто выполнил две команды alter table, одну, чтобы удалить при обновлении из созданного at, а другую, чтобы добавить его в столбец 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 правильно создал бы эти столбцы. (Я сам еще не использую миграции, поэтому, вероятно, я также столкнулся с проблемой.)

Ответ №3:

Небольшое обновление для @EpicWally — я не думаю, что вам нужно добавлять ОБНОВЛЕНИЕ в столбец 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"');
    });
}