【问题标题】:Laravel 7.x Observer not saving, created_by updated_by userLaravel 7.x Observer 未保存,created_by updated_by 用户
【发布时间】:2020-09-06 20:41:15
【问题描述】:

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

通过使用此命令

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

要更新我在ResourceController 中使用update 函数

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';
    }
}

请帮忙?!

【问题讨论】:

    标签: laravel observers


    【解决方案1】:

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

    所以,在ResourceObserver 中,我只是将方法从updated 更改为updating, 和createdcreating

    【讨论】:

    • 您没有进行大规模更新(这将直接在构建器上调用update)......您只是在听模型已经保存后发生的事件(因此是过去时'created', 'updated')你必须在此之后再次保存模型,所以选择 updatingcreating 对你正在做的事情更有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2014-11-10
    • 2015-02-07
    • 2015-04-21
    • 2011-12-27
    相关资源
    最近更新 更多