cod*_*bug 12 laravel laravel-4
我在'已保存'模型事件中有以下代码:
Session::flash('info', 'Data has been saved.')`
Run Code Online (Sandbox Code Playgroud)
因此,每次保存模型时,我都可以通过flash消息通知用户.问题是,有时我只需更新像'status'这样的字段或增加'计数器'而我不需要flash消息.那么,是否可以暂时禁用触发模型事件?或者是否有任何类似的Eloquent方法$model->save()不会触发"已保存"事件?
Dan*_*Dan 29
在这里,您可以看到如何禁用和再次启用事件观察器:
public function saveWithoutEvents(array $options=[])
{
return static::withoutEvents(function() use ($options) {
return $this->save($options);
});
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看Laravel文档
Mor*_*abi 23
在泰勒的Twitter页面上有一个很好的解决方案:
将此方法添加到基本模型中,或者如果没有该方法,请创建一个特征,或将其添加到当前模型中
public function saveQuietly(array $options = [])
{
return static::withoutEvents(function () use ($options) {
return $this->save($options);
});
}
Run Code Online (Sandbox Code Playgroud)
然后在您的代码中,每当需要保存模型而不触发事件时,只需使用以下命令:
$model->foo = 'foo';
$model->bar = 'bar';
$model->saveQuietly();
Run Code Online (Sandbox Code Playgroud)
非常优雅和简单:)
And*_*ell 10
要为最终在这里寻找解决方案的任何人回答这个问题,您可以使用以下unsetEventDispatcher()方法禁用实例上的模型侦听器:
$flight = App\Flight::create(['name' => 'Flight 10']);
$flight->unsetEventDispatcher();
$flight->save(); // Listeners won't be triggered
Run Code Online (Sandbox Code Playgroud)
小智 7
调用模型Object然后调用unsetEventDispatcher之后,您可以执行任何操作,而无需担心事件触发
像这个:
$IncidentModel = new Incident;
$IncidentModel->unsetEventDispatcher();
$incident = $IncidentModel->create($data);
Run Code Online (Sandbox Code Playgroud)
在 laravel 7.x 中,你可以像这样简单地做到这一点
use App\User;
$user = User::withoutEvents(function () {
User::findOrFail(1)->delete();
return User::find(2);
});
Run Code Online (Sandbox Code Playgroud)
在 Laravel 8.x 中:
保存没有事件的单个模型
有时您可能希望“保存”给定模型而不引发任何事件。您可以使用 saveQuietly 方法来完成此操作:
$user = User::findOrFail(1);
$user->name = 'Victoria Faith';
$user->saveQuietly();
Run Code Online (Sandbox Code Playgroud)
您不应该将会话闪烁与模型事件混合在一起 - 当发生某些情况时,模型没有责任通知会话。
您的控制器最好在保存模型时调用会话闪存。
这样您就可以控制何时实际显示消息 - 从而解决您的问题。
| 归档时间: |
|
| 查看次数: |
9460 次 |
| 最近记录: |