【问题标题】:How to fire an update event when updating one to one relationships in Laravel?在 Laravel 中更新一对一关系时如何触发更新事件?
【发布时间】:2020-03-13 01:52:28
【问题描述】:

我有两个实体:

  1. 员工

一个人有一个员工。员工属于个人。

一般来说,我的任务是:当人员数据发生变化时,我需要在修订表中制作模型的副本。每个 Person 也有很多 PersonRevision。更新人员的日志类型,在我们的应用程序中的许多地方都使用。

从技术上讲,我将 Person 和 Employee 分开,因为不是每个人都是员工,并且员工有很多额外的列。

所以,问题是:当我更新 Person 并且不触及其属性但更新员工(属于该人)属性时,更新事件不会在 PersonObserver 中触发。 这是真的,因为 Person 属性没有改变。

但是

  1. 我认为 Employee 是 Person 的一部分,为了保持人员(不是雇员)表的清洁而一对一地分开
  2. 每次更新人员属性或其员工属性时,我都需要创建 2 个修订:人员和员工。为此,我想使用事件观察者

那么,我该怎么做呢?

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案1】:

    在这种情况下,您最快的方法是为employee.updated 事件创建一个侦听器并在其中触发person.updated 事件。所以每次更新Employee 时,都会自动触发Person 更新。然后,您可以进一步检查哪些字段已更新,如果这些字段仅与 Employee 相关,而与 Person 无关,则不要触发 person.update 事件。

    这里有一个小的Laravel model events tutorial,以防您需要一些指导。

    【讨论】:

    • 好吧,即使只更新了员工数据,也意味着该人也“更新”了。因为员工属于人。另一个例子:假设我们有 Person 和 Passport。 1人1本护照。如果护照已更新,则意味着该人已更新。我可以将护照和人员合并到一张桌子上,但是这里的员工和人员是分开的,以保持人员桌子的清洁。我会检查你的链接,知道你的想法。也感谢您对 lichess 的支持 :)
    • employee.updated 事件监听器中触发person.updated 事件应该可以解决问题。您可以按照文档使用 event() 辅助函数:laravel.com/docs/5.7/events#dispatching-events。棋盘上见! :)
    • 不知道我明白了。我们谈论的是自定义事件,而不是雄辩的事件 (stackoverflow.com/questions/24937643/…) 对吧?因此,我们不使用模型观察者,而是使用我们自己的事件(person.updated、employee.updated),并在此处在事件处理程序中进行修订,对吧?可能需要注意的是:如果用户同时更新人员和员工数据,它将像这样工作:在人员更新后创建人员和员工修订,在员工更新后创建人员和员工修订,并且可能还有一个循环。嗯..
    • 我认为观察者不会在这里这样做。您应该使用 EventListeners。然后你可以通过自定义事件来做到这一点,例如 Person::update 和 Employee::update 都会触发相同的事件 (MyCustomUserUpdateEvent)。或者你可以模仿 Eloquent 已经生成的事件。模型事件的名称类似于 model.updatedmodel.created,因此如果您从不同的位置手动生成此类事件,模型上的事件侦听器将捕获它。
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多