【问题标题】:Laravel log after save() only when changed仅在更改时 save() 后的 Laravel 日志
【发布时间】:2022-08-19 05:43:47
【问题描述】:

在我的 Laravel 项目中,当我的 Eloquent 模型发生更改时,我试图添加一些日志记录。当模型没有改变时,我不想记录任何东西。我只想在保存到数据库后记录某些内容,以确保更改有效(例如,如果在保存操作期间出现错误并且由于错误未保存更改,则日志不会生成任何意义了)。

我的第一直觉是像这样使用->isDirty()

$myModel->save();
if ($myModel->isDirty()) {
    // Do the logging there were changes
}

但是,这不起作用,因为->isDirty() 方法在执行->save() 时会“重置”。就像->getDirty() 一样。

作为替代方案,我研究了$model->save() 的工作,因为这将返回一个关于它是否保存的布尔值。但是,即使没有执行查询(更改模型),它仍然会返回 true,因为从技术上讲它并没有失败。

我目前的解决方案是这样的:

$hasMyModelBeenChanged = $myModel->isDirty();

$myModel->save();
if ($hasMyModelBeenChanged) {
    // Do the logging there were changes
}

我假设这个用例必须非常普遍,因此必须存在一些建议或流畅的实现,从而使上述修复不理想。我的问题是,是否存在我错过的 Eloquent 方法,就像 ->isDirty() 一样,所以表示即使模型已保存到数据库后仍返回 true 的更改模型。或者也许建议我应该在这种情况下调查交易?

  • 我真的不明白当前的解决方案有什么问题?它到底有什么问题?我不明白如果没有if-statement,你怎么能逃脱,剩下的只是一行?
  • @M.Eriksson 你可能是对的,但我只是期待有一种更流畅的方式来完成这项工作。我认为一个更短更优雅的方法适合 Laravel/Eloquent 哲学。如果不存在其他方法,我会接受您的回答。
  • 看看这个library

标签: php laravel eloquent


【解决方案1】:

the Laravel docs 所述,您可以使用wasChanged 方法。此方法确定在当前请求周期内上次保存模型时是否更改了任何属性。如果需要,您可以传递属性名称以查看特定属性是否已更改。

这意味着对于我们需要做的问题:

$myModel->save();
if ($myModel->wasChanged()) {
    // Do the logging there were changes
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2017-11-10
    • 1970-01-01
    • 2021-11-30
    • 2015-05-14
    相关资源
    最近更新 更多