首页 > 解决方案 > 影响其他列的列更改

问题描述

我有下表:

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

我的要求是 when prop_enabledis , falsethen和values 应在行插入或更新期间设置为。prop1_enabledprop2_enabledprop3_enablednull

我的桌子设计是否适合解决问题?如果我的表很好地解决了问题,哪种方法更好地处理我的要求?我可以选择在数据库上创建触发器,或者从类中覆盖Createsave方法。Model

标签: laraveleloquent

解决方案


我相信最好的方法是做观察者解决方案。使用 mutator 需要大量的 mutator 来保护可以忽略它的数据结构和/或业务逻辑。观察者正在使用事件,你只能通过避免使用 eloquent 来规避它的触发。

您可以挂钩到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. 道具会发生什么,你将如何处理显示它们和更新它们?另一种方法是将 em 以更通用的方式放在另一个表中,当它们具有名称或键而不是 prop1 或 prop2 并且具有与创建它们或更新 em 相关联的逻辑时。如果你确定 prop1、prop2 和 prop3 不会改变设计,那么现在就可以了。


推荐阅读