影响其他列的列更改

时间:2020-09-18 18:11:55

标签: laravel eloquent

我有下表:

$table->boolean('prop_enabled');
$table->boolean('prop1_enabled')->nullable();
$table->boolean('prop2_enabled')->nullable();
$table->boolean('prop3_enabled')->nullable();

我的要求是,当prop_enabledfalse时,则在行插入期间应将prop1_enabledprop2_enabledprop3_enabled的值设置为null或更新。

我的餐桌设计是否适合解决问题? 如果我的桌子可以很好地解决问题,哪种方法可以更好地满足我的要求?我可以选择在数据库上创建触发器,或覆盖Create类中的saveModel方法。

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是使用Observer解决方案。使用一个转换器,需要很多转换器来保护您的数据结构和/或可以忽略它的业务逻辑。观察者正在使用事件,因此您只能通过避免使用口才来避免触发它。

您可以加入模型上的saving事件。这将在保存模型之前先对其进行查看,如果情况属实,则对其进行更改,从而创建最佳的1条查询插入。无论您的业务逻辑如何,这都会在创建或更新之前触发。

class YourModelObserver {
    public function saving(YourModel $model) {
        if ($model->prop_enabled === false) {
            $model->prop1_enabled = false;
            $model->prop2_enabled = false;
            $model->prop3_enabled = false;
        }
    }
}

在提供者中,您必须注册您的侦听器。

public function boot()
{
    YourModel::observe(YourModelObserver::class);
}

我的设计最大的问题是我以前见过的常见代码异味。当您有多个倍数时,将变量命名为数字似乎对我来说是错误的。如果您获得了4. prop,将会发生什么?如何显示它们并更新em?一种替代方法是,当它们具有名称或键而不是prop1或prop2并具有与创建或更新em相关的逻辑时,在另一个表中以更通用的方式获取em。如果您确定prop1,prop2和prop3不会改变,那么目前的设计是好的。