【问题标题】:Laravel Polymoprhic Many to Many with one field updatingLaravel 多态多对多,一个字段更新
【发布时间】:2021-06-22 14:56:39
【问题描述】:

我有一个 Equipment 模型,它是多态多对多与其他一些模型。

这是我无法弄清楚的问题。当一个设备添加到另一个模型时,hours 将在设备上每次更改。所有其他字段、sn、make、model 都是静态的。我想进行设置,以便记录对小时字段的每次更改 - 这样我就可以查询历史记录。

我应该将小时数移至equipables 表吗?添加数据透视表?最好的设置方法是什么?

这里是此模型和Equipables poly 关系的迁移概述。

        Schema::create('equipment', function (Blueprint $table) {
            $table->id();
            $table->string('sn')->index();
            $table->string('make');
            $table->string('model');
            $table->string('stock');
            $table->string('hours');
            $table->timestamps();
        });

        Schema::create('equipables', function (Blueprint $table) {
            $table->integer("equipment_id");
            $table->integer("equipable_id");
            $table->string("equipable_type");
            $table->timestamps();
        });

感谢您提供的任何帮助。

【问题讨论】:

    标签: laravel eloquent polymorphism pivot-table


    【解决方案1】:

    您可以通过创建和事件来实现此场景,并在您的任何目标模型创建或更新时调用它。通过这种方式,您可以跟踪他们的行为并更新设备表。
    例如模型A与设备有变形关系,我通过运行php artisan make:event ACreated创建一个名为ACreated的事件,并在创建A模型实例后调用该事件。

    $a = A::create([
        // Some sample array data here
    ]);
    
    event(new ACreated($a));
    

    ACreated 事件:

    class ACreated
    {
        public $a;
    
        public function __construct(App\Models\A $a){
            $this->a = $a;
        }
    }
    

    然后在您的 EventServiceProvider 中,将 ACreated 事件链接到侦听器,例如 AWasCreated listener(php artisan make:listener AWasCreated)。

    事件服务提供者:

    protected $listen = [
        App\Event\ACreated::class => [
            App\Listener\AWasCreated::class,
        ],
    ];
    

    最后,在监听器中执行你的逻辑:

    AWasCreated:

    class AWasCreated
    {
        public function handle($event){
            $a = $event->a;
            $a->equipment->increment('hours');
        }
    }
    

    【讨论】:

    • 好的,谢谢巴巴克。但是拥有小时字段的最佳位置是什么?模型本身不起作用,因为它会覆盖旧数据。是否最好将小时字段放在可配表上?
    • 当你使用 morphBy​​Many 方法时,你有一个带有数据透视表的变形表。您应该在变形表而不是数据透视表中定义您的自定义列。数据透视表应该只存储关系数据,但你可以在特殊情况下保存额外的数据,而不是你的情况。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 2021-04-04
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多