2015-06-15 6 views
9

Я использую Laravel 5.1. Чтобы сделать это просто, у меня есть следующий кодEloquent model not update updated_at timestamp

миграции:

Schema::create('sitemap_data', function (Blueprint $table) { 
    // Primary and foreign keys 
    $table->increments('id'); 
    $table->string('postUrl'); 
    // Database functions 
    $table->timestamps(); 
}); 

И это код где-то еще я использую

$sitemapData = SitemapData::firstOrNew([ 
       'postUrl' => $post 
      ]); 
$sitemapData->save(); 

Теперь, согласно документации Laravel

Опять же, обновленная временная метка обновляется автоматически, поэтому нет необходимости вручную устанавливать ее значение

Значение updated_at должно быть обновлено в таблице. Однако этого не происходит.

Он устанавливается только на первую вставку, но не на обновление. Когда я делаю это вручную, вот так:

$sitemapData = SitemapData::firstOrNew([ 
        'postUrl' => $post 
       ]); 
$sitemapData->updated_at = Carbon::now(); 
$sitemapData->save(); 

это работает. Однако документы говорят, что это должно произойти автоматически, так что здесь не так?

Я искал некоторые сайты на StackOverflow для этого вопроса, но те, которые я нашел, где для Laravel 3 или 4.1, 4.2 и т.д.

Как бы я сделать это правильно?

+5

Если нет никаких изменений в данных записи, то она не будет обновляться ..... это просто ненужные накладные расходы .... и '$ sitemapData = SitemapData :: firstOrNew ([ «postUrl» => $ post ]); $ sitemapData-> save(); 'никоим образом не изменяет данные записи –

+0

Ах, ладно! Я думал, что update_at обновляется независимо от изменений или нет. Вы правы, что я не вносил изменений, я просто хотел проверить, работает ли это или нет. Благодарю. Теперь это имеет смысл – Musterknabe

+1

Нет, здесь Laravel пытается быть умным и избегать расходов на вызов базы данных, если нет необходимости –

ответ

17

Как указано в комментариях, если модель не изменилась, временные метки не будут обновляться. Однако, если вам нужно обновить их, или вы хотите, чтобы проверить, все ли работает нормально использовать $model->touch() - более here

+0

как насчет 'created_at'. Я наткнулся на ошибку, где 'created_at' был установлен в 0, а' updated_at' был правильным. Возможно, обновление 'updated_at' было обновлено позже. Однако я не могу восстановить эту проблему. Это был случайный случай. – Cybersupernova

1

Это возможно на самом деле:

$model->updated_at = Carbon::now(); 
$model->save(['timestamps' => FALSE]); 

Это будет правильно сохранить updated_at до сих пор. Если вы не уверены, изменился ли какой-либо из столбцов модели, но вы действительно хотите обновить updated_at - это путь.

0

Да что сделал Musterknabe является правильным, но он должен также проверить свою модель SitemapData.php он должен иметь множество $ = временные метки верно;

1 <?php 
2 
3 class SitemapData extends Eloquent { 
4 
5   public $timestamps = true;