首页 > 解决方案 > Laravel 7.x Observer 未保存,created_by updated_by 用户

问题描述

我有一个名为“资源”的模型。

通过使用此命令

php artisan make:observer ResourceObserver --model=Resource

此命令创建一个新文件,我更新createdupdated功能和更新constructor

<?php

namespace App\Observers;

use App\Resource;

class ResourceObserver
{
    protected $userID;

    public function __construct()
    {
        $this->userID = auth()->user()->id;
    }

    /**
     * Handle the resource "created" event.
     *
     * @param  \App\Resource  $resource
     * @return void
     */
    public function created(Resource $resource)
    {
        $resource->created_by = $this->userID;
    }

    /**
     * Handle the resource "updated" event.
     *
     * @param  \App\Resource  $resource
     * @return void
     */
    public function updated(Resource $resource)
    {
        $resource->updated_by = $this->userID;
    }

    /**
     * Handle the resource "deleted" event.
     *
     * @param  \App\Resource  $resource
     * @return void
     */
    public function deleted(Resource $resource)
    {
        //
    }

    /**
     * Handle the resource "restored" event.
     *
     * @param  \App\Resource  $resource
     * @return void
     */
    public function restored(Resource $resource)
    {
        //
    }

    /**
     * Handle the resource "force deleted" event.
     *
     * @param  \App\Resource  $resource
     * @return void
     */
    public function forceDeleted(Resource $resource)
    {
        //
    }
}

这是我的迁移:

    public function up()
    {
        Schema::create('resources', function (Blueprint $table) {
            $table->id();
            // some fields here
            $table->foreignId('created_by')->nullable()->default(null)->constrained('users')->onDelete('set null');
            $table->foreignId('updated_by')->nullable()->default(null)->constrained('users')->onDelete('set null');
            $table->timestamps();
        });
    }

那么你应该AppServiceProvider像这样注册观察者:

use App\Observers\ResourceObserver;
use App\Resource;
public function boot()
{
    Schema::defaultStringLength(191);
    Resource::observe(ResourceObserver::class);
}

现在问题出现在更新任何记录时它不保存user_id

更新我使用update的功能ResourceController

public function update(Request $request, Resource $resource)
{
    $validations = [
        // some validations
    ];
    $request->validate($validations);

    try {
        if (!empty($resource)) {
            $resource->field_a = $request->field_a;
            $resource->field_b = $request->field_b;
            $resource->field_c = $request->field_c;
            $resource->save();
            return 'done messge';
        } else {
            return 'error message';
        }
    } catch (\Exception $e) {
        return 'bug message';
    }
}

请问有什么帮助吗?!

标签: laravelobservers

解决方案


通过 Eloquent 发布批量更新或删除时,不会为受影响的模型触发savedupdateddeleting和model 事件。deleted这是因为在发布批量更新或删除时从未真正检索到模型。

所以,在ResourceObserver我刚刚从方法更改为updatedupdatingcreatedcreating


推荐阅读