【问题标题】:Eloquent model event are saved and created both called when create is used?Eloquent 模型事件在使用 create 时被保存和创建?
【发布时间】:2016-05-11 09:31:56
【问题描述】:

关于使用 Eloquent 模型事件,我想知道模型事件如何响应方法调用,是否与特定事件(常见事件)有任何重叠,如果有,如何处理为此类事件编写代码?

例如,如果我有一个模型,我调用create() on,即Model::create($array),据我所知,在幕后,当我调用create() 时,save() 方法被称为as shown in the docs

/**
 * Save a new model and return the instance.
 *
 * @param  array  $attributes
 * @return static
 */
public static function create(array $attributes = [])
{
    $model = new static($attributes);
    $model->save();
    return $model;
}

因此请记住这一点,如果我希望 saved()created() 事件相同的行为,我是否只需为 saved() 事件创建一个事件而无需担心关于created() 事件,因为create() 方法是save() 方法的一种包装器(如上所示)。所以我可以这样做:

public static function boot()
{
    parent::boot();

    // covers created and saved events, as create() method triggers save()
    static::saved(function($model) {
        // do xyz
    });
}

或者我需要创建两个单独的方法来监听这两个事件吗?像这样:

public static function boot()
{
    parent::boot();

    static::created(function($model) {
        // do xyz
    });

    static::saved(function($model) {
        // do xyz
    });
}

所以只是重复我在开头提出的问题:

  • 模型事件如何响应方法调用
  • 是否与特定事件有任何重叠(常见事件,如上所述)
  • 如果有,如何实际地为此类事件编写代码

任何有关理解此过程的指导将不胜感激,谢谢!

【问题讨论】:

    标签: php laravel events eloquent


    【解决方案1】:

    有 3 个围绕模型保存在数据库中的事件。它们是createdupdatedsaved

    第一次保存模型时调用created

    updated 在以后保存模型时被调用。

    saved 在模型被保存的任何时候(包括它第一次创建时)都会被调用。

    所以saved 是一个包罗万象的。

    此外,当模型刚刚创建时,它的 wasRecentlyCreated 属性设置为 true。

    因此,如果您只有一个saved 事件,您仍然可以通过检查该属性来处理创建和更新之间的区别。

    至于你如何处理代码,这取决于你。

    就个人而言,如果我有一些仅在创建模型时才需要的代码,我会使用该方法。更新也是如此。

    但如果我有一些共享代码需要在每次保存模型时发生,但在创建模型时还需要一些特殊的东西,我不会创建单独的 created 事件,我只会使用 @987654331 @ 并检查 wasRecentlyCreated

    【讨论】:

    • 我到底应该如何在静态 ::saved 上检查 $this->wasRecentlyCreated ?为什么他们不能像普通人那样创建/保存事件?
    • @alextoader saved 方法将保存为第一个参数的模型传递给您,因此只需检查 wasRecentlyCreated 即可。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2020-09-05
    • 2020-01-30
    • 2014-12-14
    相关资源
    最近更新 更多