Php 未触发laravel雄辩模型更新事件
圣诞快乐,伙计们 我是拉雷维尔的新手。当我试图使用服务提供者和模型事件来记录更新信息时,我遇到了一个初学者的问题 以下是在线文档: 将所有代码放在一起之后,我发现模型事件只在创建用户时触发,而在编辑用户时从不记录任何内容 我错过什么了吗?感觉$user没有被正确分配。它是从哪里来的?来自其他服务提供商 任何解释或暗示都将不胜感激Php 未触发laravel雄辩模型更新事件,php,laravel,eloquent,Php,Laravel,Eloquent,圣诞快乐,伙计们 我是拉雷维尔的新手。当我试图使用服务提供者和模型事件来记录更新信息时,我遇到了一个初学者的问题 以下是在线文档: 将所有代码放在一起之后,我发现模型事件只在创建用户时触发,而在编辑用户时从不记录任何内容 我错过什么了吗?感觉$user没有被正确分配。它是从哪里来的?来自其他服务提供商 任何解释或暗示都将不胜感激 <?php namespace App\Providers; use App\User; use Illuminate\Support\ServiceProv
<?php
namespace App\Providers;
use App\User;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
User::creating(function ($user) {
Log::info('event creating');
});
User::created(function ($user) {
Log::info('event created');
});
User::updating(function ($user) {
Log::info('event updating');
});
User::updated(function ($user) {
Log::info('event updated');
});
User::saving(function ($user) {
Log::info('event saving');
});
User::saved(function ($user) {
Log::info('event saved');
});
User::deleting(function ($user) {
Log::info('event deleting');
});
User::deleted(function ($user) {
Log::info('event deleted');
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
可能的原因:
该行根本没有更新-没有更改。因此没有开火,并且
您使用了update
。检查此处的文档:
通过Eloquent发布大规模更新时,不会为更新的模型触发已保存和更新的模型事件。这是因为在发布大规模更新时,从未实际检索模型
您需要从数据库中检索用户,然后保存该用户以触发事件。例如:
这不会触发更新事件:
User::where('id', $id)->update(['username' => $newUsername]);
User::find($id)->update(['username' => $newUsername]);
这将触发更新事件:
User::where('id', $id)->update(['username' => $newUsername]);
User::find($id)->update(['username' => $newUsername]);
创建和编辑的代码是什么?这可能是因为没有进行任何更改,因此事件没有触发,或者您正在进行大规模更新,而这根本不是触发事件。谢谢@LionelChan、ohgodhous和Eric Tucker!将更新更改为:User::find($id)->update(['username'=>$newUsername])后,事件触发器工作正常;谢谢你的帮助!这同样适用于delete
。只有在创建模型对象时,模型才会触发相关事件。这意味着它仅在您执行查找
,获取
,首先
首先检索对象时激发:);您必须发出find($id)
并手动修改属性以使其正常工作。此操作:User::find(4)->update(['earings'=>0])代码>而这不是:$user=user::find(1)$用户->耳数=0$用户->更新()
。在第二种情况下,没有触发事件。你能解释一下原因吗?这两种说法的区别是什么?它们不是都是批量分配吗?这是有效的:User::find(4)->update(['earings'=>0])代码>而这不是:$user=user::find(1)$用户->耳数=0$用户->更新()
。在第二种情况下,没有触发事件。你能解释一下原因吗?这两种说法的区别是什么?它们不是都是质量分配吗?您的两个示例都在做相同的事情,并且只有在模型不干净的情况下才会触发事件。在您的情况下,仅当$user->earings
不等于0
时,才会触发模型事件。这可能是您正在经历的情况。您的意思是如果耳环的原始值不是0。事实并非如此。这就是为什么我要做$user->earings=0代码>。这样它就会改变,实例就会变脏。好的。我正在阅读源代码,试图理解这一点。我现在的问题是,“如何更改属性(例如:$user->earings=0;
)使实例变脏?哪种代码/函数可以做到这一点?当Laravel从数据库中提取模型时,它会立即存储原始状态的快照。然后,当您更新属性时,在将这些更改持久化到数据库之前,Laravel会根据最初从数据库中提取的属性检查每个属性的当前状态。当其中至少有一个不匹配时,该模型被视为脏模型,只有在该模型不匹配时,才会将实际的更新命令发送到数据库并触发事件。