1

我在控制器中有这样的代码:

for($i=0; $i<$number_of_tourists; $i++) {

$tourist = Tourist::updateOrCreate(['doc_number' => $request['doc_number'][$i]],
$tourist_to_update);

}

因此,updateOrCreate 方法可以 1) 更新记录,2) 创建新记录 3) 如果 $tourist_to_update 等于数据库中已有的记录,则保持记录不变。

我只想将 $tourist_to_update 保存到 $array[] 中,仅在更新“旅游”表中的记录时(而不是在创建新记录或没有任何更改时)。

据我所知,有一些 Eloquent 事件https://laravel.com/docs/5.4/eloquent#events更新更新的事件,这似乎符合我的需求。

问题是我看了和阅读了几个教程,但仍然不明白如何使用它们。

我知道如何在 Tourist 模型中注册 Eloquent 事件:

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

    static::updating(function ($model) {

    });
}

谁能解释我如何通过 Eloquent 事件实现我的目标?

先感谢您。

4

3 回答 3

1

这是一种更复杂的方法,但如果您只想获取数据已更改的更新记录,则此方法可行。在您的控制器方法中添加:

app()->singleton('touristsCollector', function ($app) {
    $collector = new \stdClass;
    $collector->updated = [];

    return $collector;
});

for($i = 0; $i < $number_of_tourists; $i++) {
    $tourist = Tourist::updateOrCreate(
        ['doc_number' => $request['doc_number'][$i]],
        $tourist_to_update
    );
}

$collector = resolve('touristsCollector');
var_dump( $collector->updated ); // Only updated tourists which have data changed

这基本上将向应用程序容器添加一个标准 PHP 类,该类将从模型事件中收集所有更新的游客。在您的模型中添加以下内容:

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

    static::updated(function ($model) {
        $collector = resolve('touristsCollector');
        $collector->updated[] = $model;
    });
}

这将基本上从应用程序容器中获取 PHP 类,仅在其某些属性已更新时添加旅游模型。

于 2017-08-16T08:41:30.383 回答
0

如果模型已创建,则该属性wasRecentlyCreated将设置为 true,因此您可以通过以下方式检查模型是新的还是更新的:

$updated = [];

for($i = 0; $i < $number_of_tourists; $i++) {
    $currentTourist = ['doc_number' => $request['doc_number'][$i]];
    $tourist = Tourist::updateOrCreate($currentTourist, $tourist_to_update);

    if ( $tourist->wasRecentlyCreated ) {
        continue; // Go to next loop if this tourist was created now
    }

    $updated[] = $tourist;
}
于 2017-08-16T08:28:14.477 回答
0

如果您总是想在更新旅游表中的行时执行特定代码,我建议创建一个观察者来监听updatedcreate调用。

<?php

namespace App\Observers;

use App\Tourist;

class TouristObserver
{
    /**
     * Listen to the User created event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function created(Tourist $user)
    {
        // this will always trigger when you created a new entry
    }

    /**
     * Listen to the User deleting event.
     *
     * @param  \App\Tourist $user
     * @return void
     */
    public function updated(Tourist $user)
    {
        // this will always trigger when actually a row was updated
    }
}

您所要做的就是AppServiceProvider像这样注册观察者:

public function boot()
{
    Tourist::observe(\App\Observer\TouristObserver::class);
}
于 2018-02-10T15:20:18.730 回答