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);
}