Php 未触发laravel雄辩模型更新事件

Php 未触发laravel雄辩模型更新事件,php,laravel,eloquent,Php,Laravel,Eloquent,圣诞快乐,伙计们 我是拉雷维尔的新手。当我试图使用服务提供者和模型事件来记录更新信息时,我遇到了一个初学者的问题 以下是在线文档: 将所有代码放在一起之后,我发现模型事件只在创建用户时触发,而在编辑用户时从不记录任何内容 我错过什么了吗?感觉$user没有被正确分配。它是从哪里来的?来自其他服务提供商 任何解释或暗示都将不胜感激 <?php namespace App\Providers; use App\User; use Illuminate\Support\ServiceProv

圣诞快乐,伙计们

我是拉雷维尔的新手。当我试图使用服务提供者和模型事件来记录更新信息时,我遇到了一个初学者的问题

以下是在线文档:

将所有代码放在一起之后,我发现模型事件只在创建用户时触发,而在编辑用户时从不记录任何内容

我错过什么了吗?感觉$user没有被正确分配。它是从哪里来的?来自其他服务提供商

任何解释或暗示都将不胜感激

<?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会根据最初从数据库中提取的属性检查每个属性的当前状态。当其中至少有一个不匹配时,该模型被视为脏模型,只有在该模型不匹配时,才会将实际的更新命令发送到数据库并触发事件。