【问题标题】:Laravel Disable auto "updated_at" when Incrementing FieldsLaravel 在增加字段时禁用自动“updated_at”
【发布时间】:2015-11-17 12:58:24
【问题描述】:

我正在增加表中的一些总字段

$model->total_comments += 1;
$model->save();

但是,这会触发更新updated_at 的日期。我想在这些情况下禁用它。我知道我可以手动完成并完全禁用时间戳字段的自动更新。但希望有一个简单的方法来做到这一点。

编辑:

从我的代码中添加示例。请注意,此模型上没有设置观察者。

namespace App\Models;

class Language extends \Illuminate\Database\Eloquent\Model
{

}

$router->get('/test', function () {
    $model = \App\Models\Language::find(1);

    $model->words_total = $model->words_total + 1;
    $model->save(['timestamps' => false]);

    return 'boo';
});

【问题讨论】:

  • 所以更新时不需要时间戳?
  • 每当我发现自己“需要”禁用更新的时间戳时;我得出结论,我的模型中有一个不属于那里的属性。我不会将total_comments 定义为模型的属性,我会计算 cmets 的数量。尽量保持数据库规范化。

标签: php laravel timestamp laravel-5


【解决方案1】:

注意目前框架中存在一个错误,导致第一个解决方案无法正常工作。如果它得到修复,我将保持这个帖子的最新状态。 Github issue


您可以将选项数组传递给save() 并禁用该保存的时间戳:

$model->save(['timestamps' => false]);

当然,您也可以在模型上设置属性,但如果您有可能继续使用相同的模型实例,则需要将其设置回true

$model->timestamps = false;
$model->save();
$model->timestamps = true;

【讨论】:

  • 不确定->save(['timestamps' => false) 发生了什么。当我执行->getDirty() 时,它不会显示updated_at。我什至可以注释掉Eloquent\Model 中的updateTimestamps 方法。还禁用了所有观察者。这个东西仍然会更新updated_at 字段。我从缓存中获取它,但不知道这有什么关系。它还从父模型继承,然后从BaseModel 继承。由于 updateTimestamps 方法已被完全注释掉(并且 dump-autoload 运行),我无法找到它仍在更新的来源。
  • 奇怪。您的数据库是否有可能使用新的时间戳实际更新该字段? (在ON UPDATE CURRENT_TIMESTAMP 的mysql 中)可以肯定的是,记录数据库查询并查看Eloquent 实际执行的内容。
  • 我有一个调试栏,它在更新查询中包含updated_at。我检查了表格,发现那里没有自动更新。当我通过第二种方法手动启用/禁用$model->timestamps 时,它不会触发。我想这意味着在这种情况下它不是来自 MySQL 端。
  • 嗯。仅查看框架代码,我看不出该选项不起作用的原因...view on Github
  • 不是 Eloquent 专家,但可能是 Builder 中的一些错误。如果您查看Illuminate\Database\Eloquent\Model@performUpdate 方法,则有一行$this->setKeysForSaveQuery($query)->update($dirty);setKeysForSaveQuery 接收Builder 对象。更新是从 Builder 调用的,它似乎只检查模型 timestamps 字段,而不是 timestamps 参数。在Illuminate\Database\Eloquent\Builder@update 里面有一行return $this->query->update($this->addUpdatedAtColumn($values));,如果你跟着它会设置更新字段。
【解决方案2】:

暂时停用

$model->total_comments += 1;
$model->timestamps = false;
$model->save();

【讨论】:

    【解决方案3】:

    您可以在保存之前暂时禁用时间戳。

    $model->timestamps = false;
    

    【讨论】:

      【解决方案4】:

      解决方案 1:

      $model = Table::find($planId);
      $model->timestamps = false;
      $model->increment('popularity');
      $model->save();
      

      解决方案 2:

      DB::table('Table')
      ->where(‘id’, $planId)
      ->increment(‘popularity’,1)
      

      了解更多信息 https://medium.com/@panjeh/laravel-eloquent-model-increment-with-or-without-updating-timestamps-1274c6cd7f52

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        相关资源
        最近更新 更多