Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel events Laravel雄辩事件-如果更新,则实施以保存模型_Laravel Events - Fatal编程技术网

Laravel events Laravel雄辩事件-如果更新,则实施以保存模型

Laravel events Laravel雄辩事件-如果更新,则实施以保存模型,laravel-events,Laravel Events,我在控制器中有这样的代码: for($i=0; $i<$number_of_tourists; $i++) { $tourist = Tourist::updateOrCreate(['doc_number' => $request['doc_number'][$i]], $tourist_to_update); } 谁能解释一下我如何通过雄辩的事件来实现我的目标 提前感谢。如果已创建模型,则属性wasRecentlyCreated将设置为true,因此您可以通过以下方式检查模

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

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

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

}
谁能解释一下我如何通过雄辩的事件来实现我的目标


提前感谢。

如果已创建模型,则属性
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;
}
$updated=[];
对于($i=0;$i<$u游客人数;$i++){
$CurrentTourism=['doc\u number'=>$request['doc\u number'][$i]];
$tourism=tourism::updateOrCreate($CurrentTourism,$tourism\u to\u update);
如果($tourism->wasnrecentlycreated){
continue;//如果现在创建了此游客,则转到下一个循环
}
$updated[]=$tourism;
}

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

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类,仅当旅游模型的某些属性已更新时才添加该模型。

如果您总是希望在更新旅游表中的一行时执行特定代码,我建议创建一个以侦听
更新的
创建
调用

<?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
    }
}

因此,您想创建一个新数组
$array
,该数组只包含已更新的记录?@TheFallen yes:)完全正确!谢谢你,艾伦。但我认为存在一个问题updateOrCreate’除了更新和创建之外,还有第三个行为:3)如果$tour_to_update等于数据库中已有的值,则保持记录不变。我认为您的代码将向$updated[]数组中添加一个已经在db中且不需要更新或创建的游客。我刚刚实现了你的代码。是的,它确实将未更改的游客添加到数组$updated…:(@SergejFomin,ye,你是对的,要只获取更新的游客,你可以将时间戳处的
updated_与当前时间进行比较,或者查看我的其他答案。哇,这就是我想要的-使用雄辩的模型来完成这件事!:)你真是大师!:)不过,我有一些问题:如果我将“static:updated”更改为“static:updated”,我看不出有什么区别。那么有什么区别呢?:)我在哪里可以阅读更多关于“app()->singleton”和“\stdClass”的信息?:)@SergejFomin,
更新
事件将触发,即使属性相同,
更新
仅在数据发生一些更改时才会触发,因此您需要
更新
事件。@SergejFomin,这是应用程序容器绑定,
stdClass
是一个匿名PHP库标准类,您可以使用普通数组而不是此类。
protected static function boot()
{
    parent::boot();

    static::updated(function ($model) {
        $collector = resolve('touristsCollector');
        $collector->updated[] = $model;
    });
}
<?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
    }
}
public function boot()
{
    Tourist::observe(\App\Observer\TouristObserver::class);
}