Laravel 在链接关系创建方法中静音观察者事件

Vin*_*nce 1 php observers laravel laravel-9

我有一个关于如何根据我传递的参数使观察者的方法静音的问题。我有一个参数link_social,如果它设置为 false,我希望观察者不触发该created()函数。

       $role = $request->role == 'creator' ? 'creator' : 'sponsor';

        if($request->link_social == true){
            $user = Auth::user()->$role()->create([
                'name' => $request->safe()->name,
                'about' => $request->safe()->about,
                'account_plan_id' => $accountPlan->id,
            ]);
        } else{
            $user = Auth::user()->$role()->create([
                'name' => $request->safe()->name,
                'about' => $request->safe()->about,
                'account_plan_id' => $accountPlan->id,
            ])->saveQuietly();
        }
Run Code Online (Sandbox Code Playgroud)

User模型有一个关系方法creator,观察者来自该模型,名为CreatorObserver

但我得到了这个 "message": "Call to undefined method App\\Models\\Creator::saveQuitely()"

保存(编辑)时出错,但仍然会触发created()创建者观察者中的事件,该观察者正在将记录保存在另一个表中。

我正在尝试做类似的事情$user->role->create()->saveQuitely()

创造者观察者

class CreatorObserver
{
    /**
     * Handle the Creator "created" event.
     *
     * @param  \App\Models\Creator  $creator
     * @return void
     */
    public function created(Creator $creator)
    {
        if ($creator->user->social_identifier['platform'] === PlatformType::Google->value) {
            $youtube = new YoutubeService($creator->user->social_identifier);
            SocialPlatform::createFor($creator, $youtube);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用户模型

    public function sponsor()
    {
        return $this->hasOne(Sponsor::class);
    }

    public function creator()
    {
        return $this->hasOne(Creator::class);
    }
Run Code Online (Sandbox Code Playgroud)

创造者模型

class Creator extends Model
{
    use HasFactory;

    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function socialPlatforms()
    {
        return $this->hasMany(SocialPlatform::class);
    }
}
Run Code Online (Sandbox Code Playgroud)

Zna*_*nar 5

saveQuietly/ createQuietly 不应在 create 之后链接,因为 create 函数将调度由观察者创建函数处理的创建事件。为了防止模型分派事件,可以通过以下两种方式之一完成:使用 createQuietly

$user = Auth::user()->$role()->createQuietly([
        'name' => $request->safe()->name,
        'about' => $request->safe()->about,
        'account_plan_id' => $accountPlan->id,
    ]);
Run Code Online (Sandbox Code Playgroud)

或使用模型 withoutEvents 函数

$user = Model::withoutEvents(function () use ($request, $role, $accountPlan) {
        return Auth::user()->$role()->create([
            'name' => $request->safe()->name,
            'about' => $request->safe()->about,
            'account_plan_id' => $accountPlan->id,
        ]);
    });
Run Code Online (Sandbox Code Playgroud)

使用基本模型作为创建的模型可以是 Creator 或 Sponsor 如果模型类已知,我们可以将 Model::withoutEvents 替换为 YourModelName::withoutEvents